我对下面的内容感到困惑。所以让我简单解释一下。
int ia [3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}
};
for (const int (&r)[4] : ia)
for (int &x : r) --> this has error
x = 1;
错误是"类型' const int'的绑定值引用类型' int'滴' const'限定符"
引用r到int数组,但它是一个const引用。这是可以理解的。使用r的内部for循环,它将迭代内部数组。 r是对数组的const引用,但不是每个项目。那么为什么会有错误?
我可以用下面的代码替换它,它可以工作..
for (const int (&r)[4] : ia)
for (int x : r) --> this has error
x = 1;
我明白了。 任何帮助表示赞赏。
答案 0 :(得分:3)
您不能对const
数组的元素进行非const
引用。 r
是对const
数组的引用,因此您无法对其元素进行非const
引用。
尝试for(int (&r)[4]: ia)
答案 1 :(得分:3)
使用时
for (const int (&r)[4] : ia)
您现在拥有一个const
int
的数组。您不能将非const
引用绑定到其中一个元素,因为这违反了正确性。
另一方面,当您使用
时for (int x : r)
您不再参考而是制作副本。您始终可以将const
元素复制到非const
元素中,因为您无法修改副本中的const
元素。
答案 2 :(得分:0)
目前还不清楚你在哪里感到困惑;这是一组可能的混淆点。
对const数组的引用与对const元素的数组的引用相同。
当一个C ++程序员说const引用时,它们意味着对const的引用;除了对const的引用之外,没有const引用这样的东西。
您无法从对数组的const引用中获取非const元素引用。
您的代码尝试这样做。编译器说“不”。
答案 3 :(得分:0)
数组和基于范围的循环只是模糊了问题。一个更简单的代码表现出相同的错误:
int main() {
int x = 0;
const int& y = x;
int& z = y;
}
导致:
error: binding value of type 'const int' to reference to type 'int' drops 'const' qualifier
int& z = y;
^ ~
即使x
不是const
并且使用引用就像使用原始变量(大多数时候),您也无法从const引用中获取非const引用。
也很容易理解为什么不允许这样做。考虑
void foo(const int& x);
foo
无法更改传递的参数值,但如果允许上述内容,foo
可以实现为:
void foo(const int& x) {
int& y = x; // now I am allowed to change it
y++;
}
这会明显违反常量,因此不允许这样做。