C++
ключевое слово mutable
Поиск…
нестатический модификатор члена класса
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