Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么基于范围的for语句按auto&;取值范围&;?_C++_For Loop_C++11_Auto_Universal Reference - Fatal编程技术网

C++ 为什么基于范围的for语句按auto&;取值范围&;?

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

基于范围的声明在§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-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&
,则可以进行任何类型的迭代。