c++ - 为什么基于范围的 for 语句通过 auto&& 获取范围?

标签 c++ for-loop c++11 auto universal-reference

一个基于范围的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_iterators 返回到其内容。如果您想对内容进行非 const 遍历,那将无济于事。

关于c++ - 为什么基于范围的 for 语句通过 auto&& 获取范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13241108/

相关文章:

c++ - 将代码从 gcc 移植到 clang

c++ - Sprite 如何跳跃以及它在c++中基于什么逻辑?

arrays - 我如何获得“其他”消息仅打印一次?

C++:宏可以将 "abc"扩展为 'a' 、 'b' 、 'c' 吗?

c++ - 几次(非常好)迭代后循环崩溃/损坏

javascript - 如何在ajax成功方法中获取数组值?

c++ - 命名空间中的模板函数导致错误

c++ - 如何更改 QLineEdit 中部分文本的颜色?

c++ - gcc used 属性的用例是什么?

c++ - 类方法的多重定义