在范围内引用
Reference in range for
我研究了引用总是需要初始化的。那么,为什么在我的C++书中报告为基于范围的示例的这段代码应该是正确的呢?
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector <int> v {0, 1, 2, 3} // should double each element of v,
// without writing it.
for (auto &r : v)
{
r *= 2;
}
return 0;
}
谢谢你们所有的回答,我知道你们都是熟练的程序员......但是有些答案对我来说还是太高级了,所以我会选择最适合我的。再次感谢!
在基于语句的范围的语义描述中,有
for-range-declaration = *__begin;
相对于您的示例,这相当于
auto &r = *__begin;
也就是说,引用始终是初始化的。
以下是 C++ 标准中语句范围的完整语义定义
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
这就是这句话
for ( for-range-declaration : expression ) statement
在语义上等效于上面的构造。
例如,如果表达式是一个名为 a 的数组,其中包含 N 个元素,则循环将如下所示
for ( auto __begin = a, __end = a + N; __begin != __end; ++__begin )
{
auto &r = *__begin;
//...
}
我总是喜欢想到
for (auto &r : v)
{
...
}
相当于
std::for_each(std::begin(v),std::end(v),[&](auto &r)
{
...
});
请注意,lambda 中的auto &r
需要 C++14。
编辑:或混合标准中的定义@VladfromMoscow和
答案来自@JBL for(
auto it = std::begin(v),
end = std::end(v);
it != end;
++it)
{
auto& r = *it;
//Loop code
}
也许这比标准中的描述更容易掌握(尽管它不如标准中的描述精确)。
引用在每次迭代中初始化,以引用向量的每个元素。
这种风格的 for 循环大致相当于类似的
for (auto it = v.begin(); it != v.end(); ++it) {
auto &r = *it;
// your code goes here
}
在其中可以看到引用已初始化。
另一个答案引用了语言标准的完整定义,如果你对血腥的细节感兴趣。
因为基于范围的 for 循环的语义大致等效于以下(可读)代码:
auto it = v.begin();
for(; it != v.end(); ++it){
auto& r = *it;
//Loop code
}
也就是说,每次都声明并初始化引用。
> auto& r
组件并不意味着表示整个声明;它只指定要在每次迭代中生成的元素的类型和名称。
初始化在每次迭代开始时由 range-for 的内部为您处理。这就是重点!:)
同样,在下文中,您不会自行为x
赋值;它由循环完成:
for (int x : v) {}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- 在类范围内声明时,应在 C++14 中引用变量模板
- Visual Studio 15 - 重命名错误:在所选范围内找不到引用
- 使用对指针的引用作为循环C++11范围内的序列
- 如果左值不再在其定义范围内使用,编译器是否允许将左值转换为右值引用
- 在范围内引用
- 通过引用传递向量,并在基于for循环的范围内更改其值