2012-11-05 106 views
14

範圍基於for語句在§6.5.4定義爲等同於:爲什麼基於範圍的語句採用auto &&的範圍?

{ 
    auto && __range = range-init; 
    for (auto __begin = begin-expr, 
      __end = end-expr; 
     __begin != __end; 
     ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
    } 
} 

其中range-init被用於這兩種形式的範圍所定義的基於for爲:

for (for-range-declaration : expression)   => (expression) 
for (for-range-declaration : braced-init-list) => braced-init-list 

(該條款進一步規定了其他子表達式的含義)

爲什麼__range給出e推導類型auto&&?我對auto&&的理解是,它通過傳遞std::forward來保存表達式的原始值(左值/右值)是有用的。但是,__range未通過std::forward傳遞到任何地方。它僅在獲取範圍迭代器時使用,如__range,__range.begin()begin(__range)之一。

使用「通用參考」auto&&有什麼好處? auto&會不會足夠?

注意:據我所知,the proposal沒有說任何關於auto&&的選擇。

+1

這樣你可以使用範圍內的r值。 –

+0

「*據我所知,該提案沒有提及auto &&的選擇。*」該提議還使用了C++ 11中不存在的範圍庫。 –

+2

爲了將來的參考,例如由例如描述的表達的性質。 「左值」或「右值」是它的值類別。 –

回答

16

會不會自動&夠了?

不,它不會。它不允許使用計算範圍的r值表達式。使用auto&&是因爲它可以綁定到l值表達式 r值表達式。所以你不需要將範圍粘貼到變量中以使其工作。

或者,換一種方式,這將是不可能的:

for(const auto &v : std::vector<int>{1, 43, 5, 2, 4}) 
{ 
} 

豈不const auto&就夠了?

不,它不會。一個const std::vector將永遠只會返回const_iterator s的內容。如果您想對內容執行非const遍歷,那將無濟於事。

+0

糟糕,我其實是想問一下'const auto&'是否夠用。這不會綁定到任何東西嗎? –

+0

@sftrabbit:它不會綁定到*非const * l值。 'const std :: vector'將只返回'const'迭代器。 –

+0

謝謝。這意味着'auto &&'在綁定到任何東西時也是有用的,除了轉發之外,它不會使其成爲'const'。 –