C++可变的动机

Motivation for mutable in C++

本文关键字:动机 C++      更新时间:2023-10-16

可能的重复项:
C++ "可变"关键字
您什么时候使用过C++"可变"关键字?

我了解mutable的含义以及如何使用它,我想知道的是它存在背后的真正动机是什么。我不认为唯一的动机是绕过this在成员函数中的不变性const我宁愿认为还有更多的东西。
我不认为这只是绕过设计不佳系统中问题的一种手段吗?还是吗?

原始问题的一个明显分支是什么时候使用mutable即使在一个好的设计中也有意义?

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

例如,如果没有mutable,则无法将存储为成员变量的互斥锁锁定在语义上不修改对象状态的访问器中,因为编译器中的语法检查会抱怨您正在修改互斥锁。还有其他激励性的例子,如记忆,其中实现细节(优化、线程安全)意味着在不修改对象可见状态的方法中更改成员变量。

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

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

动机是绕过this的不变性。关键是物体的某些部分必须发生变异,但对物体的可见状态没有贡献。有时修改只是一个实现细节,不应该在界面中真正可见(并且可能会发生变化。

例如,mutices锁定数据结构。即使对于const方法,也可能需要锁定结构,以确保在读取结构时没有其他线程正在修改结构。如果该方法不更改对象,则在逻辑上应该const(公开通过锁定和解锁对象所做的更改似乎很愚蠢),因此您需要使互斥mutable