易变的

一个说明符,可以应用于类的非静态非引用数据成员的声明。即使对象是 const,类的可变成员也不是 const

class C {
    int x;
    mutable int times_accessed;
  public:
    C(): x(0), times_accessed(0) {
    }
    int get_x() const {
        ++times_accessed; // ok: const member function can modify mutable data member
        return x;
    }
    void set_x(int x) {
        ++times_accessed;
        this->x = x;
    }
};

Version >= C++ 11

在 C++ 11 中添加了 mutable 的第二个含义。当它遵循 lambda 的参数列表时,它会抑制 lambda 函数调用运算符上的隐式 const。因此,可变 lambda 可以修改由 copy 捕获的实体的值。有关更多详细信息,请参阅 mutable lambdas

std::vector<int> my_iota(int start, int count) {
    std::vector<int> result(count);
    std::generate(result.begin(), result.end(),
                  [start]() mutable { return start++; });
    return result;
}

请注意,当使用这种方式形成可变 lambda 时,mutable 不是存储类说明符。