2012-03-11 31 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循環中使用此值會導致未定義的行爲。