遗留代码改变了一个 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 中。
我有一些代码多年来积累了很多东西。它有一个 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 中。