【发布时间】:2017-08-15 17:38:01
【问题描述】:
考虑不涉及复制省略的情况(C++17 之前)。
来自 cppreference(再次假设 C++14):
在以下情况下会创建临时对象:
- 将引用绑定到纯右值
- 从函数返回纯右值
- 创建纯右值的转换
- lambda 表达式
- 需要转换初始化程序的复制初始化
- 构造 std::initializer_list 的列表初始化
- 引用初始化为不同但可转换的类型或位域。
除了第一个之外的所有情况似乎都无关紧要,第一个似乎意味着 C++ 样式的引用绑定(int &&x = 5; BTW 在这种情况下我不明白临时对象在完整结束时被销毁的声明-表达式...,对象 5 所指的对象似乎没有在语句末尾被破坏)。
因此,据我了解,临时对象的概念仅包括那些保证被存储的对象(由于可能的省略,在我的情况下并非如此)。我对么?否则我在这里误解了什么?
顺便说一句,int x = 4;(或int x = 2 + 2; 中的2 + 2)中的MyClass() 和4 之间有什么区别吗?就像我可能不正确一样,第一个确实引用了一个临时对象,而另外两个没有...
【问题讨论】:
-
它被计入“创建纯右值的转化”的情况下。 (是的,它看起来不像是转换,但标准将
T()、T(1)和T(1,2)组合在一起。) -
@T.C.那么这样的事情是否仅适用于
MyClass()案例呢?不以我提出的4为例?那么造成这种差异的原因是什么?也许您可以创建一个答案?..考虑到您似乎与已经存在的答案相矛盾.. -
“创造prvalue的转换”是否仍会涵盖4?在这种情况下,它是从整数文字到纯右值整数的转换。
-
@NirFriedman 这些有什么区别吗?我认为“整数文字”正是整数纯右值的情况之一。再次来自 cppreference:以下表达式是纯右值表达式:文字(字符串文字除外),例如 42、true 或 nullptr;