サーチ…
非静的クラスメンバー修飾子
このコンテキストにおけるmutable
修飾子は、オブジェクトの外部可視状態に影響を与えることなくconstオブジェクトのデータフィールドが変更され得ることを示すために使用される。
高価な計算の結果をキャッシュすることを考えているなら、おそらくこのキーワードを使うべきです。
constメソッド内でロックされてロックされているロック( std::unique_lock
)データフィールドがある場合、このキーワードも使用できます。
このキーワードを使用して、オブジェクトの論理的な恒久性を破壊しないでください。
キャッシュ付きの例:
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