汽车&&外面的范围

时间:2015-02-12 10:55:18

标签: c++ c++11 rvalue-reference auto

我是否正确地假设写作

auto && x = ...;

在范围的for (...)部分之外几乎没有意义,因为如果右边确实是右值,它通常会停止以分号存在,然后x指的是被摧毁的东西。

换句话说:

Widget f () { ... }
...
auto && x = f();
// do something with x

错了?

1 个答案:

答案 0 :(得分:2)

来自标准[class.temporary]:

  

有两种情况下,临时表在与完整表达结束时不同的点被销毁。第一个上下文是调用默认构造函数来初始化数组的元素。

     

第二个上下文是引用绑定到临时的。引用所在的临时值   绑定或临时,即绑定引用的子对象的完整对象仍然存在   在参考文件的生命周期中除外:
   - 绑定到函数调用(5.2.2)中的引用参数的临时对象将持续到完成   包含呼叫的完整表达式    - 函数返回语句(6.6.3)中返回值的临时绑定的生存期不是   扩展;临时在return语句中的完整表达结束时被销毁    - 临时绑定到 new-initializer (5.3.4)中的引用仍然存在,直到完成   包含new-initializer的full-expression。

auto&& x = f();行属于第二个上下文,并不适用任何例外情况。因此,临时持续参考的生命周期。所以代码没有错。