我是否正确地假设写作
auto && x = ...;
在范围的for (...)
部分之外几乎没有意义,因为如果右边确实是右值,它通常会停止以分号存在,然后x
指的是被摧毁的东西。
换句话说:
Widget f () { ... }
...
auto && x = f();
// do something with x
错了?
答案 0 :(得分:2)
来自标准[class.temporary]:
有两种情况下,临时表在与完整表达结束时不同的点被销毁。第一个上下文是调用默认构造函数来初始化数组的元素。
第二个上下文是引用绑定到临时的。引用所在的临时值 绑定或临时,即绑定引用的子对象的完整对象仍然存在 在参考文件的生命周期中除外:
- 绑定到函数调用(5.2.2)中的引用参数的临时对象将持续到完成 包含呼叫的完整表达式 - 函数返回语句(6.6.3)中返回值的临时绑定的生存期不是 扩展;临时在return语句中的完整表达结束时被销毁 - 临时绑定到 new-initializer (5.3.4)中的引用仍然存在,直到完成 包含new-initializer的full-expression。
第auto&& x = f();
行属于第二个上下文,并不适用任何例外情况。因此,临时持续参考的生命周期。所以代码没有错。