2017-08-15 130 views
7

考虑不涉及copy-elision的情况(在C++ 17之前)。MyClass obj = MyClass(); 'MyClass()'在这里引用临时对象吗?

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

  • 参考结合于prvalue
  • 返回从prvalue:

    临时对象在以下情况下产生功能

  • 创建预估值的转换
  • lambda表达式
  • 副本初始化,需要初始化
  • 列表初始化该构建一个std :: initializer_list
  • 参考初始化到一个不同的,但可转换类型或一个位域的转换。

所有除了第一个案例似乎无关紧要,第一个似乎意味着C++ - 样式的引用结合(int &&x = 5; BTW我没有在这样的情况下理解语句临时工在年底销毁完整表达...,对象5指的是在声明结尾似乎没有被破坏)。

所以,据我了解,临时对象的概念只包括那些被保证存储的人(在我的情况下,由于可能的影响,情况并非如此)。我对么?否则我在这里误解了什么?

BTW是有在int x = 4;MyClass()4(或int x = 2 + 2;2 + 2)之间的任何差异?就像也许我是不正确的,第一个是指一个临时对象,而另外两个不是......

+1

它下的“转换,创建一个prvalue”情况计数。 (是的,它看起来不像是一种转换,而是标准组合T(),T(1)和T(1,2)。) –

+0

@ T.C。那么这样的事情只是为了'MyClass()'的情况而已?不是以我提出的'4'为例吗?那么这种差异的基本原理是什么?也许你可以创建一个答案?..考虑到你似乎与现有的矛盾.. – ledonter

+0

不会仍然被“转换创造一个价值”所覆盖?在这种情况下,它是从整数文字转换为一个前值整数。 –

回答

1

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

类类型的临时对象被在各种情况下产生:参考结合到prvalue([...]),返回 一个prvalue([...]),转换一个创建prvalue ([...] 5.4),抛出一个例外([...]), 以及一些初始化([...])。

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

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

此外8.5初始值设定([dcl.init])非类类型初始化的条款(17.8)的语义定义为

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

对于类类型,调用(复制)构造函数。所以你需要一个(临时)对象来为类类型复制,但不能用于“其他”类型。

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

+0

也许你知道,如果从你引用的片段中可以转换__,例如'float x = 4;'(int to float conversion),是否有一个临时对象,它的原始int为4?并且是将一个单独的对象从一个'x'转换成的结果?不知道它在这种情况下是如何工作的。 – ledonter

+0

没有临时对象,因为prvalue'4'直接转换为prvalue'4.f',然后被赋值。所以不需要int类型的对象,只需要一个值,所以不需要创建临时对象。转换的结果再次是一个价值,它不是一个对象,所以它不能与'4'相同。 –

+0

请问在[N4296](https://wg21.link/n4296)中的“MyClass()”是一个显式类型转换?似乎没有找到它。 (如上所述,它只是看起来像一个构造函数而不是转换) – Bigman

相关问题