使用对指针的引用作为循环C++11范围内的序列
Using reference to pointer as a sequence in C++11 range for loop
以下两个代码片段之间的唯一区别是引用的使用。我理解为什么第一个片段无法编译,并正在寻求帮助以了解第二个片段编译的原因。
第一个片段:
int a[2][3] = {0,1,2,3,4,5};
for (auto row : a)
for (auto column : row)
cout << column << endl;
上面的代码无法编译,因为"row"的类型是指向int的指针,int不是一个序列。
第二个片段:
int a[2][3] = {0,1,2,3,4,5};
for (auto &row : a)
for (auto column : row)
cout << column << endl;
此代码将编译。如果我正确理解自动的工作原理,"行"是对指向 int 的指针的引用。但是,为什么可以将此引用视为序列而不是常规指针?
类型的推导是通过模板参数推导完成的。
template <typename U>
void foo(U&); // Equivalent to auto&
foo(row);
这将始终推断U
是确切的row
类型(如果在这种情况下它是左值(,这为我们提供了所需的数组类型。
仅对非参考参数执行数组到指针衰减。
外部迭代的每个元素都是一个数组。在第一种情况下,auto
按值获取元素,因此会发生数组到指针衰减,然后您无法遍历单个指针。
在第二种情况下,你会得到对数组的引用,你当然可以迭代它。
std::begin
和std::end
没有指针类型的重载。定义基于范围的 for 循环以使用这些函数。如果要防止发生数组到指针的转换,可以将引用绑定到数组。
§8.5.3
5
对类型">cv1T1
"的引用由表达式初始化 类型">CV2T2
",如下所示:— 如果引用是左值引用和初始值设定项 表达
— 是一个左值(但不是位字段(,">cv1
T1
" 是 与">CV2T2
"兼容的引用,或— 具有类类型(即,
T2
是类类型(,其中T1
不是 与T2
相关的引用,并且可以隐式转换为 类型为">cv3T3
"的左值,其中">cv1T1
"为 参考兼容">CV3T3
">106(此转换 通过枚举适用的转换函数来选择。 (13.3.1.6(并通过重载分辨率选择最佳 (13.3((,然后将引用绑定到初始值设定项表达式 lvalue 第一种情况和转换的左值结果在 第二种情况(或者,在任一情况下,到适当的基类 对象的子对象(。[ 注:通常的左值到右值 (4.1(, 数组到指针 (4.2( 和函数到指针 (4.3( 标准 转换是不需要的,因此在这样的情况下被禁止 完成与左值的直接绑定。— 尾注 ]
由于第二个项目符号点不适用,因此引用直接绑定到数组,不会发生转换。
- C++11 基于范围的 for 循环,用于 std::list
- C++11:没有复制构造函数的自定义基于范围的循环
- 当程序预期根据用户输入再次循环时,它会导致分段错误:11
- 如何在Visual Studio(C++11)中处理相互依赖/循环依赖
- 如何使用 c++11 语法创建 for 循环以遍历向量
- 自动和范围内 for 循环 C++11 不起作用
- 我写了一个函数来删除循环链接列表中的第 1 个节点,但输出显示无限次"55 44 33 22 11 99",那么我该如何解决呢?
- C++ for 循环中的 11 个线程类成员函数会给出分段错误
- 声明中的循环依赖性C 11
- C 的性能11现代风格的循环与老式循环
- 当遇到很长的循环时,会出现分段错误:11 或内存分配错误
- 内存分配,用于在C 11中循环中函数的返回值:如何优化
- 基于范围的循环:自动更改C 11中的含义
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- for 循环中的常量指针 (C++ 11)
- 如何将基于迭代器的 for 循环重写为基于范围的循环 (C++11)
- 用于循环的c++(c++11方式和旧版本方式)
- 嵌套c++11范围循环,用于查找组合
- 在 C++11 段错误中基于范围的 for 循环,但不是常规 for 循环
- C++中循环语法糖的简写(11)