範囲ベースの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&&
。