一、修饰类成员变量

此关键字只能应用于类的非静态和非常量数据成员mutable 是为了让 const 对象的某些数据成员可以被修改。static 是类的成员,不属于对象,常对象和常函数只会限制类的成员变量修改,所以类的 static 数据成员不需要 mutable 修饰,在常对象和常函数中也能被修改。

class Person{
public:
    int getAge() const{
        m_count++;
        s_count++;
        return m_age;
    }
    int getCount()const{
        return m_count;
    }
private:
    int m_age{20};
    mutable int m_count{0};
public:
    static int s_count;
};
int Person::s_count = 0;

int main()
{
    Person p;
    p.getAge();
    p.getAge();
    p.getAge();
    cout << p.getCount() << endl;   // 3
    cout << p.s_count << endl;      // 3
    return 0;
}

二、修饰匿名函数

表示可以修改按值传入的变量的副本(不是值本身),类似于不带 const 关键字的形参。使用 mutable 关键字后对按值传入的变量进行的修改,不会将改变传递到 Lambda 表达式之外。如果不加 mutable 关键字,按值传入的变量是只读的,即使在 Lambda 表达式内部也不可修改

int main () {
    int x = 1;
    int y = 1;
    int z;
    cout << "x1: " << x << "\t y1: " << y << endl;
    z = [=]() mutable -> int
    {
        ++x;
        ++y;
        cout << "x2: " << x << "\t y2: " << y << endl;
        return x + y;
    }();
    cout << "x3: " << x << "\t y3: " << y << endl;
    cout << "z: " << z << endl;
  return 0;
}

输出:

x1: 1	 y1: 1
x2: 2	 y2: 2
x3: 1	 y3: 1
z: 4