mutable
关键字是一种穿透const
覆盖在物体上的面纱的方法。如果您有一个指向对象的 const 引用或指针,则您不能以任何方式修改该对象,除非它被标记的时间和方式mutable
。
使用您的const
参考或指针,您将被限制为:
- 仅对任何可见数据成员的读取权限
- 仅调用标记为 的方法的权限
const
。
该mutable
例外使您现在可以编写或设置标记为 的数据成员mutable
。这是唯一外部可见的区别。
在内部const
,您可以看到的那些方法也可以写入标记为 的数据成员mutable
。本质上,const 面纱被全面刺穿。完全由 API 设计者来确保mutable
不会破坏const
概念并且仅在有用的特殊情况下使用。mutable
关键字有帮助,因为它清楚地标记了受这些特殊情况影响的数据成员。
在实践中,您可以const
在整个代码库中痴迷地使用(您本质上是想用const
“疾病”“感染”您的代码库)。在这个世界中,指针和引用const
几乎没有例外,产生的代码更容易推理和理解。对于一个有趣的题外话查找“参考透明度”。
如果没有mutable
关键字,您最终将被迫使用它const_cast
来处理它允许的各种有用的特殊情况(缓存、引用计数、调试数据等)。不幸const_cast
的是,它的破坏性比mutable
它强制 API客户端破坏const
他正在使用的对象的保护要大得多。此外,它会导致广泛的const
破坏:const_cast
使用 const 指针或引用允许对可见成员进行不受限制的写入和方法调用访问。相比之下mutable
,API 设计人员需要对异常进行细粒度控制const
,而这些异常通常隐藏在const
对私有数据进行操作的方法中。
(注意,我多次提到数据和方法的可见性。我说的是标记为公共与私有或受保护的成员,这是此处讨论的完全不同类型的对象保护。)