Motivation for mutable in C++
Possible Duplicate:
C++ 'mutable' keyword
When have you used C++ 'mutable' keyword?
我理解mutable的含义及其使用方式,我想知道的是它存在的真正动机是什么。 我不认为唯一的动机是绕过const成员函数中this的不变性而我认为还有更多的东西。
我不认为这只是在设计不良的系统中绕过问题的手段吗? 或者是吗?
使用mutable的原始问题的明显分支在即使在好的设计中也有意义吗?
-
stackoverflow.com/questions/4554031/…
-
@DumbCoder:感谢您的链接,但这不能回答我的问题。
-
这不是答案,更多是针对你的分支问题。
-
是的它 - 它提供了很好的例子,你可能想要"绕过const",这不是"设计不佳的系统"。
-
@DumbCoder:好在这里的人所以实际上并没有阅读任何东西,只是跑来跑去标记任何被发布的相关内容。 2票已经结束。
-
@Als:你还想要什么来回答你的问题?
-
@Ben:这是唯一被问到的问题吗?
-
@Als:你必须明白投票是重要的。虽然不完全相同,但声称您的问题的答案是支持语言中其他问题的答案是可以理解的。
-
@ DavidRodrí guez-dribeas:根据SO政策Q如果它们是完全重复的话,将被投票关闭作为重复。如果需要的话,对meta的一点点搜索会提出该线程。这就是说我询问的动机Q不是代表农业我有很多那些所谓的代表,我认真地不需要任何这种方式。我的动机是要理解细微的细节,像你这样的答案很好地揭示。我不理解这里的暴民心态因此,跳出来关闭任何远程相关的东西。用这种态度学习任何新东西变得越来越困难。
-
@Nawaz:查找詹姆斯或大卫的答案,应该告诉你我在寻找什么。
-
@Als:你需要更多的答案,其中包含更多的文字而不是不同的答案。
-
@Nawaz:对不起,你的评论对我没用。[谈话结束]
-
@Als:你的两个都没有意义[对话结束] ;-)
实际上,动机是绕过const方法中this的不变性(语法级别)。 const是语义检查,由编译器在语法上进行验证。任何在语义上不修改对象状态的操作都应该是const,但在某些情况下,实现需要更改子对象,而mutable是告诉编译器此特定成员不属于该状态的语法工具对象的,因此可以在const方法内修改。
例如,如果没有mutable,则无法将存储为成员变量的互斥锁锁定在访问器中,该访问器在语义上不会修改对象的状态,因为编译器中的语法检查会抱怨您正在修改互斥锁。还有其他一些激励性的例子,例如memoization,其中实现细节(优化,线程安全)意味着在不修改对象的可见状态的方法中更改成员变量。
-
当你的意思是状态时,你的意思是该类用户观察到的行为? 是什么意思是由类本身的内部簿记而不是它暴露给用户的功能?
-
@Als:任何不影响程序其余部分结果的东西。 memoization中的缓存值与重新处理计算时获得的值完全相同,因此对于外部世界,无论是否缓存,结果都不会影响结果。 重要的一点是const是一个语义标记,而mutable是一种语法结构,用于告诉编译器该特定成员在语义上不属于您的状态。
mutable是将按位const与逻辑const分开的一部分。
基本上,编译器实现的内容称为按位const:it
如果你试图修改const中实际对象的位,则会抱怨
功能,但不是。当你写一堂课时,你想要
实现逻辑const:const函数不修改observable
对象的值(类的作者定义的是什么
可观察的价值)。大多数情况下,这是一个不修改东西的问题,
即使你可以(例如通过指针访问的部分值),
但每隔一段时间,实际物体中就有"位"(如图所示)
编译器)不是可观察值的一部分:缓存值
懒惰计算是经典的例子,但可以想象其他人:
例如,移动链接列表中的元素
列表中的元素需要更新指向previous和
next(但是列表中元素的位置不是其中的一部分
元素的可观察价值)。
-
+1提到按位const& 逻辑const概念使我成为公认的答案。
一个常见的需求是实现memoization。对于外部世界,函数调用不是修改对象状态,而是在内部必须更新memoization缓存。将缓存标识为mutable允许。
动机是绕过this的不变性。关键是对象的某些部分可能必须进行变异,但不会对对象的可见状态做出贡献。有时修改只是一个实现细节,在界面中不应该真正可见(并且可能会有所变化)。
一个例子是mutices用于锁定数据结构。即使对于const方法,您也可能需要锁定结构,以确保在读取结构时没有其他线程正在修改结构。如果方法没有改变对象,它应该在逻辑上const(暴露通过锁定和解锁对象所做的更改似乎很愚蠢),所以你需要制作互斥锁mutable。