2012-03-11 85 views
17

在最新的C++标准它意味着:C++ 11:基于范围的语句:“range-init”生存期?

for (foo : bar) 
    baz; 

是equivilant到:

{ 
    auto && r = bar; 
    for (auto it = r.begin(), end = r.end(); it != end; ++it) 
    { 
     foo = *it; 
     baz; 
    } 
} 

当在上面的酒吧是一个函数调用返回一个集合,例如:

vector<string> boo(); 

ie

for (auto bo : boo()) 
    ... 

不行成为:

auto&& r = boo(); 
... 

所以嘘的临时返回值()在声明中“自动& & R = BOO()”的结尾被破坏,则R是在循环的入口处悬挂参考。 ??这个推理是否正确?如果不是,为什么不呢?

+1

首先,'矢量 BOO();'不声明一个对象。它声明了一个函数。其次,我不明白你的问题。 – Nawaz 2012-03-11 18:37:01

+6

是“矢量 BOO()”是返回集合的示例功能的签名。该函数然后在下面的行中调用。 – 2012-03-11 18:38:08

回答

15

这个推理是否正确?如果不是,为什么不呢?

这是正确的,直到这一点:

所以嘘的临时返回值()在声明中 “自动& & R = BOO()”[年底被破坏。 ..]

将临时绑定到引用将其生存期延长为引用的生存期。因此,整个循环的临时持续时间(这也是为什么在整个构造周围有一组额外的{}:正确地限制该临时的寿命)。

这根据的C++标准的§12.2第5段:

的第二上下文是当引用绑定到一个暂时的。该 临时到该参考绑定或者是将引用绑定 的子对象的 完整的对象持续引用除外寿命临时:

[这里不适用各种异常]

这是一个有趣的属性,允许滥用范围-for循环非rangey事情:http://ideone.com/QAXNf

+0

你有一个标准的参考? – 2012-03-11 18:42:02

+0

@ user1131467我提供了适当的引用(我没有失去规则的例外情况:引用过长。) – 2012-03-11 18:47:02

6

的推理是不正确的,因为boo按值返回一个临时对象。将该临时对象绑定到引用意味着临时对象的生命周期被延长。标准报价(§12。2/5):

[...]临时到该参考是结合或临时也就是其中引用绑定持续基准的寿命的子对象的完整的对象[...]

的推理是正确的,如果boo返回的参考。将表示返回给临时对象的表达式的示例是string("a") += string("b");在基于范围的for循环中使用此值会导致未定义的行为。