在最新的 C++ 标准中,它意味着:
for (foo : bar)
baz;
相当于:
{
auto && r = bar;
for ( auto it = r.begin(), end = r.end(); it != end; ++it )
{
foo = *it;
baz;
}
}
当上面的 bar 是一个返回集合的函数调用时,eg:
vector<string> boo();
ie
for (auto bo : boo())
...
该行不是变成:
auto&& r = boo();
...
所以临时返回值boo()
在语句末尾被销毁auto&& r = boo()
,然后 r 是循环入口处的悬挂引用。这个推理正确吗?如果没有,为什么不呢?
这个推理正确吗?如果没有,为什么不呢?
到目前为止它是正确的:
因此 boo() 的临时返回值在语句“auto&&r=boo()”末尾被销毁 [...]
将临时对象绑定到引用可将其生命周期延长为引用的生命周期。所以临时持续整个循环(这也是为什么有一组额外的{}
围绕整个构造:正确限制该临时的生命周期)。
这是根据 C++ 标准 §12.2 的第 5 段:
第二个上下文是当引用绑定到临时对象时。这
引用绑定到的临时对象或作为引用的临时对象
引用绑定到的子对象的完整对象
在引用的生命周期内持续存在,但以下情况除外:
[此处不适用的各种例外情况]
这是一个有趣的属性,允许滥用 ranged-for 循环来处理非范围的事情:http://ideone.com/QAXNf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)