自动和超出范围

auto && outside range-for

本文关键字:范围      更新时间:2023-10-16

我假设写是对的吗

auto && x = ...;

在的范围的for (...)部分之外几乎没有意义,因为如果右侧确实是右值,它通常会停在分号处,然后x指的是已经被破坏的东西。

换句话说:

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

错了吗?

来自标准[class.temporary]:

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

第二个上下文是引用绑定到临时的。引用所指向的临时绑定的或作为引用绑定到的子对象的完整对象的临时对象仍然存在在引用的生存期内,以下情况除外:
--在函数调用(5.2.2)中,绑定到引用参数的临时对象将一直持续到完成包含调用的完整表达式的
--函数返回语句(6.6.3)中返回值的临时绑定的生存期不是扩展;临时在return语句中的完整表达式末尾被销毁
--到新初始值设定项(5.3.4)中引用的临时绑定将持续存在,直到包含新初始值设定项的完整表达式。

auto&& x = f();行属于第二个上下文,没有任何异常适用。因此,在引用的生命周期内,临时性持续存在。所以这个代码没有错。