旧版代码会改变const指针。任何正当的理由?

时间:2016-06-22 09:44:48

标签: c++ casting const undefined-behavior

我有一些代码,这些代码在很多年里累积了很多。它有一个类似于:

的类
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成员最初使用过&#34;正确&#34;并在构造函数中初始化,但随着时间的推移,添加了初始化对象的其他方法,这些方法不适合该模式,因此const_cast被用作解决方法。实际的类非常大(数千行),并且初始化很复杂,以至于无法以尊重const的方式将其分解出来。

据我所知,这是未定义的行为,因此应该通过移除const上的data_限定符来解雇它。但是这段代码已经开了很长时间而没有引起任何明显的问题,所以我不确定是否有我遗漏的东西 - 这是(错误地)使用{{在理论上或实践中,是否可以接受?写这样的东西是否有任何可以想象的好处,或者它只是一个没有被破坏的幸福事故呢?

1 个答案:

答案 0 :(得分:3)

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

const int* data_;

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

您无法更改* data_(您无法更改指定值)

当你对它执行static_cast时,仅当data_指向没有const的int时才允许它。如果data_指向const int,则static_cast会导致未定义的行为。

所以在这种情况下代码很好,因为data_只会指向int(而不是const int),无论是使用Foo第一个构造函数还是使用loadToBuffer。