C++ 为什么基于范围的for语句按auto&;取值范围&;?
基于范围的声明在§6.5.4中定义为等同于:C++ 为什么基于范围的for语句按auto&;取值范围&;?,c++,for-loop,c++11,auto,universal-reference,C++,For Loop,C++11,Auto,Universal Reference,基于范围的声明在§6.5.4中定义为等同于: { auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } } 其中,range ini
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
其中,range init
为的两种基于范围的形式定义为:
for ( for-range-declaration : expression ) => ( expression )
for ( for-range-declaration : braced-init-list ) => braced-init-list
(本条进一步规定了其他子表达式的含义)
为什么\uu range
给定了推断类型auto&
?我对auto&&
的理解是,通过std::forward
传递表达式,它有助于保留表达式的原始值(左值/右值)。但是,\u range
不会通过std::forward
传递到任何地方。它仅在获取范围迭代器时使用,如\uuuu range
,\uuu range.begin()
,或begin(\uu range)
这里使用“通用参考”的好处是什么?auto&
注意:据我所知,没有提到选择auto&
难道自动&不够吗
不,不会的。它不允许使用计算范围的r值表达式<之所以使用code>auto&
,是因为它可以绑定到l值表达式或r值表达式。因此,您不需要将范围固定到变量中以使其工作
或者,换句话说,这是不可能的:
for(const auto &v : std::vector<int>{1, 43, 5, 2, 4})
{
}
for(const auto&v:std::vector{1,43,5,2,4})
{
}
const auto&
不,不会的。
const std::vector
只会将const_迭代器
s返回到其内容。如果你想对内容进行非const遍历,那是没有帮助的。这样你可以在范围内使用r值。“据我所知,该提案没有提到任何关于自动&&”的选择。该提案还使用了范围库,它在C++11中不存在。供将来参考,例如,“左值”或“右值”所描述的表达式的属性是其值类别。哎呀,我实际上是想问const auto&
是否足够。这不会绑定到任何东西吗?@sftrabbit:它不会绑定到非常量l值。const std::vector
将只返回const
迭代器。谢谢。这意味着除了转发之外,auto&&
对于绑定到任何东西也很有用,而不使其成为const
。只是澄清一下:对于(const auto&v:std::vector{1,43,5,2,4}){}
来说,const遍历是可能的。@fyzix:如果它不是临时向量呢?请参见,您不能根据范围是否为临时范围来更改基于范围的的定义。因此,无论您选择什么,const auto&
或auto&
在所有情况下都必须相同。如果使用const auto&
,则只能对所有范围进行const
迭代。如果使用auto&
,则可以进行任何类型的迭代。