该代码实际上不会在 VC++ 中工作 - 你没有更新值(或者至少它不应该),因此来自 GCC 的警告。正确的代码是
const_cast<myType*&>(myMember) = new myType();
或[来自其他回复,谢谢:P]:
const_cast<ThisType*>(this)->myMember = new myType();
有效地使其可变意味着您const_cast
在成员函数中获得隐含的 s ,这通常是当您发现自己在执行大量s onconst
时应该转向的方向。除此之外,没有“使用可变的副作用”。const_cast
this
正如你从围绕这个问题的激烈辩论中看到的那样,随意使用mutable
和很多const_cast
s 肯定是代码中异味的症状。从概念的角度来看,抛弃 constness 或使用mutable
可能会产生更大的影响。在某些情况下,正确的做法可能是将方法更改为非常量,即承认它正在修改状态这一事实。
这完全取决于您的上下文中 const 正确性的重要性——您不希望最终只是mutable
像精灵尘埃一样四处散布以使东西正常工作,但mutable
如果成员不是对象的可观察状态的一部分,则打算使用它。最严格的 const 正确性观点认为,不能修改对象状态的任何一点(例如,如果您的实例在 ROM 中,这可能很关键......) - 在这些情况下,您不需要任何 constness丢失。在其他情况下,您可能会将一些外部状态存储在对象之外的某处 - 例如,在确定是否合适时也需要考虑特定于线程的缓存。