违反常量正确性:我应该实际期待哪些问题?

RL-*_*L-S 2 c++

我想使用一个函数解析器库,其中成员函数FunctionParser::Eval()是非常量的,因为它将错误代码写入成员变量。我想将此函数解析器集成到代码库中,在该代码库中,将通过包含const该函数解析器的类的成员函数调用此函数,从而违反const正确性。

const成员函数是接口的一部分,其中constness 具有语义意义。我可以改变那个界面,所以这仍然是一个选择。作为测试,我曾经const_cast执行违反const正确性的代码,这不会导致任何错误或单元测试失败(至少不是在调试模式下)。

现在我的问题是:const在这种情况下违反正确性时,我应该期待什么问题?(这值得吗?)

cdh*_*wie 8

如果对象实际上是定义为const 的,那么抛弃 const-ness 来修改对象是未定义的行为。

考虑改为使用mutable关键字,它为给定字段声明了常量性的例外;一个mutable字段是总是非const甚至被认为是在当前上下文中常量的对象上访问时(包括从常量方法中)。

class foo {
private:
    int a;         // cannot be modified on a const foo
    mutable int b; // CAN be modified on a const foo!
};
Run Code Online (Sandbox Code Playgroud)

您可以将mutable关键字用于与错误跟踪相关的字段。

当然,更好的模式是在发生错误时抛出一个错误对象。如果您的 API 设计不允许这样做,则使相关字段可变是正确的解决方法。