在C++中意外创建临时对象的方法?

Mat*_*hew 7 c++ temporary object

多年前我相信C与C++相比绝对纯净,因为编译器无法生成任何你无法预测的代码.我现在相信反例包括volatile关键字和内存障碍(在多处理器编程或内存映射硬件设备的设备驱动程序中,其中普通汇编语言甚至比C编译器的优化更纯粹).

目前我正在尝试枚举C++编译器可以执行的不可预测的事情.关于C++的主要抱怨是编译器将隐式实例化临时对象,但我相信这些情况都可以预期.我正在考虑的案例是:

  • 当一个类为自己以外的类型定义一个复制构造函数时,不使用该explicit关键字
  • 当类定义重载转换运算符时: operator ()
  • 当函数通过值而不是引用接受对象时
  • 当函数按值而不是按引用返回对象时

还有其他人吗?

小智 2

我想“不可预测”的意思是“符合标准但与程序员编写代码时所期望的不同”,对吧?

我想您可以从代码中看到对象被实例化或复制的位置,即使它可能并不明显。不过可能很难理解。

有些东西只是由(所有?)编译器供应商以某些方式实现,但可以以不同的方式完成。例如,后期绑定(又名调用重载的虚拟方法)通常是在后台使用函数指针来实现的。这可能是最快的方法,但我认为可以用不同的方式来完成,这将是意想不到的。我不知道有哪个编译器的做法有所不同。

从 C++ 过于复杂的意义上来说,很多东西都是出乎意料的——几乎没有人能够理解完整的语言。所以意外也取决于你的知识。