c++ - 违反 const 正确性:我应该实际期待什么问题?
问题描述
我想使用一个函数解析器库,其中成员函数FunctionParser::Eval()
是非常量的,因为它将错误代码写入成员变量。我想将此函数解析器集成到代码库中,其中将通过const
持有该函数解析器的类的成员函数调用该函数,从而违反const
正确性。
该const
成员函数是接口的一部分,其中的const
ness 具有语义意义。我可以改变那个界面,所以这仍然是一个选择。作为测试,我曾经const_cast
执行违反const
正确性的代码,这并没有导致任何错误或单元测试失败(至少在调试模式下没有)。
现在我的问题是:在这种情况下违反const
正确性时,我应该期待什么问题?(那值得吗?)
解决方案
如果对象实际上是定义的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 设计不允许这样做,则使相关字段可变是正确的解决方法。
推荐阅读
- token - 在币安智能链上创建慈善代币?
- scala - spark.driver.memory与“show()”和“count()”的关系,spark、scala中的except()函数性能如何?
- javascript - 下拉菜单中的文本换行问题 在 Firefox 浏览器中选择 > 选项
- pandas - 导出带有格式且不带引号的熊猫数据框
- compiler-errors - 使用 MSP430 驱动程序库时出错:“此 ROM 仅支持大数据模型。”
- cordova - Android 9 上的 Ionic-cordova 移动应用 appcompat 通知
- awk - 如何使用 awk 在 while 读取循环中搜索字符串
- java - 在 Java 中声明带有或不带有“new”关键字的数组
- cmd - wevtutil 匹配带有 ' 的字符串导致错误
- java - 使用 JPA 解决 N+1 查询问题时的问题