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

时间:2017-08-15 17:38:02

标签: c++ c++14 temporary

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

来自cppreference(再次假设是C ++ 14):

  

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

     
      
  • 将引用绑定到prvalue
  •   
  • 从函数返回prvalue
  •   
  • 创建prvalue的转化
  •   
  • lambda表达
  •   
  • 需要转换初始值设定项的复制初始化
  •   
  • 构造std :: initializer_list
  • 的list-initialization   
  • 引用初始化为不同但可转换的类型或位域。
  •   

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

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

BTW在MyClass()(或4中的int x = 4;)中的2 + 2int x = 2 + 2;之间是否存在差异?就像我可能不正确,第一个引用临时对象而另外两个不引用......

1 个答案:

答案 0 :(得分:1)

C ++ 14标准[1]在12.2中说临时对象([class.temporary]):

  

类类型的临时数在各种上下文中创建:绑定对prvalue([...])的引用,返回   prvalue([...]),一个创建prvalue([...],5.4)的转换,抛出异常([...]),   并在一些初始化([...])。

MyClass obj = MyClass();中,MyClass()是功能表示法中的显式类型转换,因此它是一个临时对象,因为它属于“创建prvalue的转换”。

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

另外8.5个Initializers([dcl.init])将子句(17.8)中非类型初始值设定项的语义定义为

  

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

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

[1]:实际上N4296,但这不应该有所作为