C++中可变的动机

Alo*_*ave 2 c++ mutable

可能重复:
C++'mutable'关键字
何时使用C++'mutable'关键字?

我理解mutable它的用法和方式,我想知道的是它存在的真正动机是什么.我不认为的唯一动机是绕过的不变性thisconst成员函数我宁愿认为这是给它更多的东西.
我不认为这只是在设计不良的系统中绕过问题的手段吗?或者是吗?

原始问题的明显分支何时使用mutable即使在良好的设计中也是有意义的?

Dav*_*eas 11

动机实际上绕过不变性(语法级)thisconst方法.这const是一种语义检查,由编译器在语法上进行验证.任何语义上不修改对象状态的操作都应该是const,但在某些情况下,实现需要更改子对象,并且mutable是告诉编译器该特定成员不属于对象状态的语法工具,因此可以在const方法内修改.

如果没有mutable,比如,你无法锁定存储在语义上不修改对象的状态的存取成员变量互斥,如在编译器的语法检查会抱怨说,要修改的互斥.还有其他一些激励性的例子,例如memoization,其中实现细节(优化,线程安全)意味着在不修改对象的可见状态的方法中更改成员变量.


Jam*_*nze 8

mutable是按位const与逻辑const分离的一部分.基本上,编译器实现的内容称为按位const:如果您尝试在const函数中修改实际对象的位,则会抱怨,但不是.当你编写一个类时,你想要实现逻辑const:const函数不会修改对象的可观察值(类的作者定义什么是可观察值).大多数情况下,这是一个不修改内容的问题,即使你可以(例如通过指针访问的部分值),但每隔一段时间,实际对象中有"位"(如编译器所见) t可观察值的一部分:懒惰计算的缓存值是经典示例,但可以想象其他:侵入链表中的元素,例如,在列表中移动元素需要更新指向上一个和下一个的指针(但是列表中元素的位置不是元素可观察值的一部分.


Mar*_*som 5

一种常见的需求是实现记忆。对于外部世界,函数调用不会修改对象状态,但在内部必须更新记忆缓存。将缓存标识为mutable允许的。