1.突破 const 的限制
class Test { public: Test() = default; Test(unsigned int times):times(times){ } ~Test() = default; void printOut() const { cout << "out" << endl; times ; // 编译报错,const成员函数不能修改成员数据变量 } private: unsigned int times; // 用来记录输出操作一共被执行了多少次 };
mutable关键字可以突破const的限制。被mutable修饰的成员变量永远处于可变的状态,即使在const成员函数中也是。
但是有时候我们需要在const修改与类状态无关的数据成员,那么此时应该用mutable修饰。
class Test { public: Test() = default; Test(unsigned int times):times(times){ } ~Test() = default; void printOut() const { cout << "out" << endl; times ; // 编译通过,此时const成员函数也可以修改类数据成员 } private: mutable unsigned int times; // 这里加入关键字mutable };
2.可变lambda
默认情况下,对于一个值被拷贝的lambda表达式,是不会改变其捕获的值的。如果我们需要改变一个被捕获变量的值,就必须在参数列表首加mutable,因此可变lambda能省略参数列表。
void fun3() { int sz = 4; auto f = [sz]() {return --sz; }; //编译错误: 不可以改变值捕获的变量 f(); }
void fun3() { int sz = 4; auto f = [sz]() mutable {return --sz; }; // 参数列表首加了mutable,则可以改变值捕获的变量 f(); }