24

範囲ベースの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は範囲ベースの2つの形式に対して次のように定義さ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、、、__range.begin()またはのいずれかとして、範囲イテレータを取得する場合にのみ使用されますbegin(__range)

ここで「ユニバーサルリファレンス」を使用する利点は何auto&&ですか?auto&十分ではないでしょうか?

注:私が知る限り、提案はの選択について何も述べていませんauto&&

4

1 に答える 1

28

オート&で十分ではないでしょうか?

いいえ、そうではありません。範囲を計算するr値式の使用は許可されません。l値式またはrauto&&値式にバインドできるために使用されます。したがって、範囲を変数に固定して機能させる必要はありません。

または、別の言い方をすれば、これは不可能です。

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

const auto&十分ではないでしょうか?

いいえ、そうではありません。Aは、sをその内容にconst std::vector戻すだけです。const_iteratorコンテンツを非トラバースしたい場合const、それは役に立ちません。

于 2012-11-05T22:07:34.580 に答える