我有一些代码,这些代码在很多年里累积了很多。它有一个类似于:
的类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_
限定符来解雇它。但是这段代码已经开了很长时间而没有引起任何明显的问题,所以我不确定是否有我遗漏的东西 - 这是(错误地)使用{{在理论上或实践中,是否可以接受?写这样的东西是否有任何可以想象的好处,或者它只是一个没有被破坏的幸福事故呢?
答案 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。