c ++:嵌套FOR范围用法中使用的const引用的混淆

时间:2017-08-23 18:11:40

标签: c++ c++11

我对下面的内容感到困惑。所以让我简单解释一下。

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;

我明白了。 任何帮助表示赞赏。

4 个答案:

答案 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++;
}

这会明显违反常量,因此不允许这样做。