簡體   English   中英

為什么基於范圍的for語句通過auto &&獲取范圍?

[英]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傳遞到任何地方。 它僅在獲取范圍迭代器時使用,作為__rangebegin(__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM