MyClass obj = MyClass(); 'MyClass()'是否在这里引用临时对象?

led*_*ter 7 c++ temporary c++14

考虑不涉及复制省略的情况(前C++ 17).

从cppreference(再次假设C++ 14):

在以下情况下创建临时对象:

  • 绑定对prvalue的引用
  • 从函数返回一个prvalue
  • 转换,创建一个prvalue
  • lambda表达式
  • 需要转换初始化程序的复制初始化
  • list-initialization,用于构造std :: initializer_list
  • 引用初始化为不同但可转换的类型或位域.

除了第一个案例之外的所有案例似乎都无关紧要,第一个案例似乎意味着C++风格的引用绑定(int &&x = 5;BTW我不明白在这种情况下临时演员在完整表达结束时被销毁的声明......,对象5指的是在语句结尾处似乎没有被销毁).

因此,据我所知,临时对象的概念仅包括那些保证存储的对象(由于可能的省略,在我的情况下不是这种情况).我对么?或者我在这里误解了什么?

BTW有任何区别MyClass(),并4在int x = 4;(或2 + 2中int x = 2 + 2;)?也许我可能是不正确的,第一个是指临时物体,而另外两个不是......

Mar*_*ger 1

C++14 标准 [1] 在 12.2 中关于临时对象 ([class.temporary]) 的规定:

类类型的临时对象在各种上下文中创建:绑定对纯右值的引用 ([...])、返回纯右值 ([...])、创建纯右值的转换 ([...], 5.4) ,抛出异常([...]),以及在某些初始化中([...])。

在 中MyClass obj = MyClass();,MyClass()是函数符号中的显式类型转换,因此它是一个临时对象,因为它属于“创建纯右值的转换”。

这不适用于4in int x = 4;,因为该规则引用“类类型”,但却int是“基本类型”。

另外,8.5 初始化器 ([dcl.init]) 将子句 (17.8) 中的非类类型初始化器的语义定义为

否则,正在初始化的对象的初始值是初始化表达式的(可能已转换)值。[...]

而对于类类型,则调用(复制)构造函数。因此,您需要一个(临时)对象来复制类类型,但不需要复制“其他”类型。

[1]:实际上是N4296,但这应该没有什么区别