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