【发布时间】:2012-11-05 22:00:28
【问题描述】:
基于范围的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 传递到任何地方。它仅在获取范围迭代器时使用,作为__range、__range.begin() 或begin(__range) 之一。
使用“通用参考”auto&& 有什么好处? auto& 不够吗?
注意:据我所知,the proposal 没有说明选择 auto&&。
【问题讨论】:
-
这样你就可以使用范围内的右值了。
-
"据我所知,该提案没有说明 auto&& 的选择。" 而且该提案还使用了范围库,它没有存在于 C++11 中。
-
为了将来参考,由 e.g. 描述的表达式的属性'lvalue' 或 'rvalue' 是它的值类别。
标签: c++ for-loop c++11 auto universal-reference