如何在C ++中意外创建临时对象?
几年前,我相信C相对于C ++来说绝对是纯粹的,因为编译器无法生成任何您无法预测的代码。 我现在认为,计数器例子包括volatile
关键字和内存障碍(在多处理器编程或内存映射硬件设备的设备驱动程序中,普通汇编语言将比C编译器的优化更纯)。
目前我正试图枚举C ++编译器可以做的不可预测的事情。 关于C ++的主要抱怨是,编译器会隐式地实例化临时对象,但我相信这些情况都是可以预料的。 我正在考虑的情况是:
explicit
关键字 operator ()
还有其他人吗?
我认为“不可预测”意味着“符合标准的东西,但不同于程序员在编写代码时期望的东西”,对吗?
我猜你可以从代码中看到实例化或复制对象的位置,即使它可能不明显。 可能很难理解。
有些东西只是由(所有)编译器供应商以某种方式实现的,但它可以以不同的方式完成。 例如,后期绑定(又称。重载,虚拟方法)通常是在后台使用函数指针来实现的。 这可能是最快的方式,但我认为它可以做不同的事情,这将是意想不到的。 我不知道任何编译器,但它不同。
很多东西都是意料之外的,C ++过于复杂 - 几乎没有人理解完整的语言。 那么意外也取决于你的知识。
12.2临时对象
1在不同的上下文中创建临时类类型:将一个右值绑定到一个引用(8.5.3),返回一个右值(6.6.3),一个创建右值的转换(4.1,5.2.9,5.2.11,5.4 ),抛出一个异常(15.1),输入一个处理程序(15.3)以及一些初始化(8.5)。
4有两种情况下,临时工在与全面压迫结束时不同的点被销毁。
其实我建议看看整个12.2
目前我正试图枚举C ++编译器可以做的不可预测的事情。 关于C ++的主要抱怨是,编译器会隐式地实例化临时对象,但我相信这些情况都是可以预料的。
编译器不会隐式创建临时对象 - 它服从标准。 当然,除非你调用未定义的行为。 请注意,有一些称为copy-elision和返回值优化的东西可能实际上减少了否则会创建的临时数量。
一个有关这个主题常见陷阱的有趣链接:
http://www.gotw.ca/gotw/002.htm
链接地址: http://www.djcxy.com/p/44551.html