甲範圍基於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&&
的選擇。
這樣你可以使用範圍內的r值。 –
「*據我所知,該提案沒有提及auto &&的選擇。*」該提議還使用了C++ 11中不存在的範圍庫。 –
爲了將來的參考,例如由例如描述的表達的性質。 「左值」或「右值」是它的值類別。 –