我不确定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?
如果我停在这里,我会假设 const vector<int *>
是 const int * const
的 vector ,但后来我尝试了以下显然与该假设相矛盾的方法。
*(w[0]) += 3; //passed. Value not constant?
*(w[0]) = 20; //passed. Why...
现在 *(w[0])
出于我不知道的原因,显然对待 ++
和 +=
和分配不同。我说服自己 const vector
仅声明 vector
的常量对象类,并且上述结果可能取决于 vector
的运算符重载的实际实现类(class)。但我无法解决这个问题。谁能帮忙解释一下?
如果相关,我在 Mac 上使用了 g++ 4.2。
最佳答案
Why is dereferenced element in const vector of int pointers mutable?
对于 const vector<int *>
, 元素将是 const
指向非 const
的指针,即 int * const
, 所以你可以修改指针指向的对象,但不能修改指针本身。
根据Operator Precedence , 后缀自增运算符的优先级高于 operator*
, 所以 *(w[0]) ++;
相当于
* ((w[0]) ++);
首先对指针进行递增,然后失败。 w[0] = &y;
也在尝试修改指针,所以也失败了。
另一方面,(*w[0]) ++;
(即增加指针)会很好。以下语句也很好,因为它们都在修改指针指向的对象,而不是指针。
*(w[0]) += 3; //passed.
*(w[0]) = 20; //passed.
关于c++ - 为什么 int 指针的 const vector 中的取消引用元素是可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46110797/