サーチ…


非静的クラスメンバー修飾子

このコンテキストにおける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