一个基于范围的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&&
的选择。
最佳答案
Wouldn't auto& suffice?
不,不会。它不允许使用计算范围的 r-value 表达式。使用 auto&&
是因为它可以绑定(bind)到左值表达式或 右值表达式。因此,您无需将范围粘贴到变量中即可使其工作。
或者,换句话说,这是不可能的:
for(const auto &v : std::vector<int>{1, 43, 5, 2, 4})
{
}
Wouldn't
const auto&
suffice?
不,不会。 const std::vector
只会将 const_iterator
s 返回到其内容。如果您想对内容进行非 const
遍历,那将无济于事。
关于c++ - 为什么基于范围的 for 语句通过 auto&& 获取范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13241108/