非静态类成员修饰符

此上下文中的 mutable 修饰符用于指示可以修改 const 对象的数据字段而不影响对象的外部可见状态。

如果你正在考虑缓存昂贵计算的结果,则应该使用此关键字。

如果你有一个锁定(例如,std::unique_lock)数据字段,它在 const 方法中被锁定和解锁,那么这个关键字也是你可以使用的。

你不应该使用此关键字来破坏对象的逻辑常量。

缓存示例:

class pi_calculator {
 public:
     double get_pi() const {
         if (pi_calculated) {
             return pi;
         } else {
             double new_pi = 0;
             for (int i = 0; i < 1000000000; ++i) {
                 // some calculation to refine new_pi
             }
             // note: if pi and pi_calculated were not mutable, we would get an error from a compiler
             // because in a const method we can not change a non-mutable field
             pi = new_pi;
             pi_calculated = true;
             return pi;
         }
     }
 private:
     mutable bool pi_calculated = false;
     mutable double pi = 0;
};