Поиск…


нестатический модификатор члена класса

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;
};

изменчивый лямбда

По умолчанию неявный operator() лямбда является const . Это запрещает выполнение const операций на лямбда. Чтобы разрешить модификацию членов, лямбда может быть помечена как mutable , что делает неявный operator() не const :

int a = 0;

auto bad_counter = [a] {
    return a++;   // error: operator() is const
                  // cannot modify members
};

auto good_counter = [a]() mutable {
    return a++;  // OK
}

good_counter(); // 0
good_counter(); // 1
good_counter(); // 2


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow