对于容器类,例如std::vector
,有两个不同的常量概念:容器的概念(即它的大小)和元素的概念。似乎std::vector
混淆了这两者,因此以下简单代码将无法编译:
struct A {
A(size_t n) : X(n) {}
int&x(int i) const { return X[i]; } // error: X[i] is non-const.
private:
std::vector<int> X;
};
请注意,即使调用 its 的数据成员(指向数据开始和结束的三个指针以及分配的缓冲区的结尾)std::vector
没有更改,但operator[]
该成员不会const
- 这不是一个奇怪的设计吗?
另请注意,对于原始指针,这两个常量概念被巧妙地分开,因此相应的原始指针代码
struct B {
B(size_t n) : X(new int[n]) {}
~B() { delete[] X; }
void resize(size_t n); // non-const
int&x(int i) const { return X[i]; } // fine
private:
int*X;
};
工作得很好。
std::vector
那么在使用(不使用)时处理这个问题的正确/推荐方法是什么mutable
?
是const_cast<>
一个
int&A::x(int i) const { return const_cast<std::vector<int>&>(X)[i]; }
被认为是可以接受的(X
已知是 non- const
,所以这里没有 UB)?
编辑只是为了防止进一步混淆:我确实想修改元素,即容器的内容,而不是容器本身(大小和/或内存位置)。