甲范围基于for
语句在§6.5.4定义为等同于:为什么基于范围的语句采用auto &&的范围?
{
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
给出e推导类型auto&&
?我对auto&&
的理解是,它通过传递std::forward
来保存表达式的原始值(左值/右值)是有用的。但是,__range
未通过std::forward
传递到任何地方。它仅在获取范围迭代器时使用,如__range
,__range.begin()
或begin(__range)
之一。
使用“通用参考”auto&&
有什么好处? auto&
会不会足够?
注意:据我所知,the proposal没有说任何关于auto&&
的选择。
这样你可以使用范围内的r值。 –
“*据我所知,该提案没有提及auto &&的选择。*”该提议还使用了C++ 11中不存在的范围库。 –
为了将来的参考,例如由例如描述的表达的性质。 “左值”或“右值”是它的值类别。 –