如何在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

    上一篇: Ways to accidentally create temporary objects in C++?

    下一篇: How does windows load DLLs