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)
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
执行对常量指针的赋值,因此它不会编译.