首页 > 解决方案 > 违反 const 正确性:我应该实际期待什么问题?

问题描述

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

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

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

标签: c++

解决方案


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

考虑改为使用mutable关键字,该关键字声明给定字段的 const-ness 异常;即使在当前上下文中被视为 const的对象(包括从 const 方法中)访问时,mutable字段也始终是非常量的。

class foo {
private:
    int a;         // cannot be modified on a const foo
    mutable int b; // CAN be modified on a const foo!
};

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

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


推荐阅读