考虑不涉及复制省略的情况(前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 + 2
和int x = 2 + 2;
之间是否存在差异?就像我可能不正确,第一个引用临时对象而另外两个不引用......
答案 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,但这不应该有所作为