Mik*_*our 38
"物理"常量来自声明一个对象const,并且原则上可以通过将对象放在只读内存中来强制执行,因此它不能更改.试图改变它会导致不确定的行为; 它可能会改变,也可能不会,或者它可能会触发保护错误,或者它可能会熔化内存芯片.
"逻辑"constness来自声明引用或指针const,并由编译器强制执行.对象本身可能是也可能不是"物理"const,但是如果没有强制转换,则不能使用引用来修改它.如果对象不是"物理上"const,那么C++允许您修改它,const_cast以避免保护.
甲mutable类构件可以修改即使类对象本身(或用于访问它的引用或指针)是const.这方面的良好用途的示例是在读取操作期间必须被锁定的互斥锁,以及用于存储昂贵的读取操作的结果的高速缓存.在这两种情况下,操作本身应该是一个const函数(因为它不会影响对象的可见状态),但它需要修改互斥锁或缓存,所以这些都需要mutable.它也可能被滥用,使物体在逻辑上不应该明显改变,所以要小心使用它; mutable如果成员不构成外部可见状态的一部分,则仅声明成员.
unw*_*ind 17
mutable当对象中的字段可以被视为"内部"时,您需要,即该类的任何外部用户都无法确定这些字段的值.即使实例被认为是常量,即不改变,类也可能需要写入这些字段.
考虑硬盘; 它的缓存就是这种状态的一个例子.从实际磁盘读取数据时写入缓存.
如果没有相应的成员mutable,就不可能在C++中干净利落地表达,即使在标记的方法中也允许更改它们const.正如评论中指出的那样,你总能找到锤子并使用a const_cast<>去除const-ness,但这当然是作弊.:)