24

基于范围的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&不够吗?

注意:据我所知,该提案没有说明auto&&.

4

1 回答 1

28

auto& 不够吗?

不,它不会。它不允许使用计算范围的r 值表达式auto&&使用它是因为它可以绑定到左值表达式右值表达式。因此,您无需将范围粘贴到变量中即可使其工作。

或者,换句话说,这是不可能的:

for(const auto &v : std::vector<int>{1, 43, 5, 2, 4})
{
}

const auto&不够吗?

不,它不会。Aconst std::vector只会将const_iterators 返回到它的内容。如果您想对const内容进行非遍历,那将无济于事。

于 2012-11-05T22:07:34.580 回答