为什么在int指针的const vetory中脱离了元素

Why is dereferenced element in const vector of int pointers mutable?

本文关键字:元素 vetory const int 指针 为什么      更新时间:2023-10-16

我不确定 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的向量,但是随后我尝试了以下内容,这显然与该假设相矛盾。

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

现在*(w[0])出于我未知的原因,显然对+++=的对待以及分配方式不同。我确信自己const vector仅声明vector类的常数对象,并且上述结果可能取决于vector类的运算符过载的实际实现。但是我无法将头缠住。谁能帮助解释?

如果是相关的,我在Mac上使用了G 4.2。

为什么在int指针的const vector中脱位元素可变?

对于const vector<int *>,该元素将是const指向非const,即int * const,因此您可以修改指针指向的对象,而不是指针本身。

根据操作员优先级,后缀增量运算符的优先级比operator*更高,因此*(w[0]) ++;等于

* ((w[0]) ++);

指针上的增量首先执行,然后失败。w[0] = &y;还试图修改指针,因此也失败了。

另一方面,(*w[0]) ++;(即点上的增量)是可以的。以下陈述也很好,因为它们都在修改指针指向的对象,而不是指针。

*(w[0]) += 3; //passed.
*(w[0]) = 20; //passed.

这是操作员优先

的问题

进行*(w[0]) ++时,您会尝试修改 Pointer

进行*(w[0]) += 3时,您会修改指向指向的数据。

wconst 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 is应用于指针本身,而不是指向的数据。

通过执行*(w[0]) += 3,您没有修改指针的值返回(是const),但是该指针指向的值。由于此指针类型为int * const(而不是const int *),因此您可以修改指向的内容,因此可以正常工作。但是,执行w[0] = &y正在执行恒定指针上的作业,因此不会编译。

const vector<T>允许您以 T const & i。 const T &)访问其元素。在这种情况下,Tint *,因此这是int * const &,是指向int指向指针的const引用。指针是恒定的,但INT不是。

向量的类型需要为 vector<int const *> vector<const int*>),在这种情况下,元素将通过 int const * const &

访问

底线,constness与模板具有传递性,但没有指针。而且,如果将指针放入模板中,您将获得两种行为。