为什么在int指针的const vetory中脱离了元素
Why is dereferenced element in const vector of int pointers mutable?
我不确定 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
时,您会修改指向指向的数据。
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 is应用于指针本身,而不是指向的数据。
通过执行*(w[0]) += 3
,您没有修改指针的值返回(是const
),但是该指针指向的值。由于此指针类型为int * const
(而不是const int *
),因此您可以修改指向的内容,因此可以正常工作。但是,执行w[0] = &y
正在执行恒定指针上的作业,因此不会编译。
const vector<T>
允许您以 T const &
( i。 const T &
)访问其元素。在这种情况下,T
是int *
,因此这是int * const &
,是指向int
指向指针的const引用。指针是恒定的,但INT不是。
向量的类型需要为 vector<int const *>
( vector<const int*>
),在这种情况下,元素将通过 int const * const &
。
底线,constness与模板具有传递性,但没有指针。而且,如果将指针放入模板中,您将获得两种行为。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何通过 getter 函数删除矢量的元素?
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 从控制台中删除最后打印的元素
- 为什么在int指针的const vetory中脱离了元素