假设您有此代码(在c ++ 14中):
auto && a = a_function_returning_a_temp_rvalue();
存储返回值的位置,当它的析构函数被调用时,是a
const
(考虑到函数不返回const
),它是如何在标准中指定的?
(甚至是合法的)
另外,你确认,临时实际上绑定到a
,没有operator=
也不会调用构造函数吗?
它在g ++上编译并避免输入长模板类,但在使用它之前,我想检查它是否在c ++ 14中明确说明
答案 0 :(得分:2)
规则在[class.temporary]中:
有三种情境可以在与完整表达结束时不同的时刻销毁临时对象。 [...]第三个上下文是指引用绑定到临时值.116引用所在的临时值 绑定或临时是绑定引用的子对象的完整对象在引用的生命周期中持续除外:
- 绑定到函数调用中的引用参数的临时对象(5.2.2)[...]
- 函数返回语句(6.6.3)中返回值临时绑定的生命周期为[...]
- 临时绑定到新初始化程序(5.3.4)中的引用一直持续到[...]
在这个例子中:
auto && a = a_function_returning_a_temp_rvalue();
我假设函数返回T
类型的东西(而不是T&
或T&&
)。在这种情况下,我们确实有一个临时绑定到引用,并且这些例外都不适用。因此,该临时的生命周期延长了a
的生命周期。
答案 1 :(得分:1)
是的,这可以保证有效。
[12.2 / 4-5]
有两种情况下,临时表在与完整表达结束时不同的点被销毁。 ...
第二个上下文是引用绑定到临时的。引用绑定的临时值或作为绑定引用的子对象的完整对象的临时值在引用的生命周期内持续存在,除了:
在函数调用中绑定到引用参数的临时对象会持续存在,直到包含该调用的完整表达式完成。
函数返回语句中返回值临时绑定的生命周期未扩展;临时在return语句中的full-expression结束时被销毁。
new-initializer 中与引用的临时绑定一直持续到包含 new-initializer 的完整表达式完成。
如果不需要,则调用构造函数或operator=
来初始化a
,a
不是const
。