遗留代码改变了一个 const 指针。有正当理由吗?

Legacy code mutates a const pointer. Any legitimate reason?

我有一些代码多年来积累了很多东西。它有一个 class 看起来像:

class Foo {
public:
  Foo(int* data) : data_(data) { }

  Foo() : data_(nullptr) { }

  void loadFile(File* file);

private:
 const int* data_;
};

void Foo::loadFile(File* file) {
  file->loadToBuffer(const_cast<int**>(&data_));
}

void File::loadToBuffer(int** buf) {
  *buf = new int[1024];
  // Load the data...
}

我相信 const 成员最初使用 "properly" 并在构造函数中初始化,但随着时间的推移,添加了其他不适合该模式的初始化对象的方法,因此 const_cast 被用作解决方法。实际的 class 非常大(数千行)并且初始化非常复杂,无法以尊重 const.

的方式将其分解出来

据我所知,这是未定义的行为,因此应该通过删除 data_ 上的 const 限定符来彻底解决它。但是这段代码已经运行了很长时间而没有引起任何明显的问题,所以我不确定我是否遗漏了什么——理论上,这种(错误)使用 const 是否可以接受还是在实践中?写这样的东西有什么可以想象的好处,还是它还没有坏只是一个幸运的意外?

这是一个指向 const int 的指针,它可以指向一个 int 或一个 const int

const int* data_;

您可以更改 data_(您可以将其指向另一个 int/const int)

你不能改变*data_(你不能改变指向的值)

当您对其执行 static_cast 时,仅当 data_ 指向不带常量的 int 时才允许这样做。 static_cast 如果 data_ 指向 const int 会导致未定义的行为。

所以在这种情况下,代码没有问题,因为 data_ 将仅指向 int(而不是 const int),无论是使用 Foo 第一个构造函数还是在 loadToBuffer 中。