对于容器类,例如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)?
编辑只是为了防止进一步混淆:我确实想修改元素,即容器的内容,而不是容器本身(大小和/或内存位置)。