为什么int指针的const向量中的dereferenced元素是可变的?

use*_*429 29 c++ pointers const vector operator-precedence

我不确定它的真正含义const vector<int *>所以我编写了下面的代码来获得一个想法但现在更加困惑.

vector<int *> v;
int x = 1, y = 2;
v.push_back(&x);
v.push_back(&y);

const vector<int *> w = v;
w[0] = &y;   //failed. Element is a constant pointer?
*(w[0]) ++;  //failed. Element pointer references to constant value?
Run Code Online (Sandbox Code Playgroud)

如果我在这里停下来,我会假设这const vector<int *>是一个向量const int * const,但后来我尝试了以下与这个假设明显矛盾的方法.

*(w[0]) += 3; //passed. Value not constant?
*(w[0]) = 20; //passed. Why...
Run Code Online (Sandbox Code Playgroud)

现在,*(w[0])对于未知的原因我明明对待++,并+=和分配方式不同.我确信自己const vector只声明了vector类的一个常量对象,并且上面的结果可能取决于运算符重载vector类的实际实现.但我无法绕过这个.有人可以帮忙解释一下吗?

如果它是相关的,我在Mac上使用g ++ 4.2.

son*_*yao 33

为什么int指针的const向量中的dereferenced元素是可变的?

因为const vector<int *>,元素将const指向非const,即int * const,因此您可以修改指针指向的对象,但不能修改指针本身.

根据运算符优先级,后缀增量运算符的优先级高于operator*,因此*(w[0]) ++;相当于

* ((w[0]) ++);
Run Code Online (Sandbox Code Playgroud)

指针的增量首先执行,然后失败.w[0] = &y;也试图修改指针,所以它也失败了.

另一方面,(*w[0]) ++;(即指针对象的增量)没问题.以下语句也可以,因为它们都修改了指针所指向的对象,而不是指针.

*(w[0]) += 3; //passed.
*(w[0]) = 20; //passed.
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 9

这是运营商优先权的问题.

当您*(w[0]) ++尝试修改指针时.

当您*(w[0]) += 3修改指针指向的数据时.


眠りネ*_*ネロク 6

w是一个const vector<int *>.所述const 限定词被施加到载体中.因此,相应的const成员函数将用于operator[]:

const_reference operator[]( size_type pos ) const;

由于向量是const-qualified并且包含类型int *(而不是const int *)的元素,因此表达式的类型w[0]int * const&(而不是const int *&).也就是说,它是对指向常量的指针的常量指针int引用,int而不是指向常量的指针引用:constness应用于指针本身,而不是指向指向的数据.

通过执行操作,*(w[0]) += 3您不会修改向量返回的指针的值(即const),而是指向此指针指向的值.由于此指针属于int * const(而不是const int *)类型,因此您可以修改它指向的内容,因此它可以正常工作.但是,正在w[0] = &y执行对常量指针的赋值,因此它不会编译.