[英]Why does a range-based for statement take the range by auto&&?
基於范圍的for
語句在§6.5.4中定義為等同於:
{
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
給出推導出的類型auto&&
? 我對auto&&
理解是,通過將表達式傳遞給std::forward
來保留表達式的原始值(左值/右值)是有用的。 但是, __range
不會通過std::forward
傳遞到任何地方。 它僅在獲取范圍迭代器時使用,作為__range
, begin(__range)
__range.begin()
或begin(__range)
。
使用“通用參考” auto&&
什么好處? 不會auto&
就足夠了嗎?
注意:據我所知, 該提案沒有說明auto&&
的選擇。
不會自動就足夠了嗎?
不,它不會。 它不允許使用計算范圍的r值表達式 。 auto&&
是因為它可以綁定到l值表達式或 r值表達式。 因此,您不需要將范圍粘貼到變量中以使其工作。
或者,換句話說,這是不可能的:
for(const auto &v : std::vector<int>{1, 43, 5, 2, 4})
{
}
const auto&
不會const auto&
就足夠了嗎?
不,它不會。 const std::vector
只會將const_iterator
返回給它的內容。 如果你想要做一個非const
在內容遍歷,那也不會幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.