'mutable' キーワードには、データ メンバーを const メンバー関数で変更できるようにする以外の目的がありますか? 質問する

'mutable' キーワードには、データ メンバーを const メンバー関数で変更できるようにする以外の目的がありますか? 質問する

少し前に、クラスのデータ メンバーを キーワードでマークするコードを見つけました。私が見る限り、これは- 修飾メンバー メソッドmutableでメンバーを変更できるようにするだけです。const

class Foo  
{  
private:  
    mutable bool done_;  
public:  
    void doSomething() const { ...; done_ = true; }  
};

これは this キーワードの唯一の用途ですか、それとも見た目以上に意味があるのでしょうか? それ以来、私はこの手法をクラスで使用し、 を としてマークして、boost::mutexスレッドmutableconst安全性のために関数がそれをロックできるようにしていますが、正直言って、ちょっとしたハックのように感じます。

ベストアンサー1

これにより、ビット単位の const と論理 const を区別できます。論理 const は、ロックの例のように、オブジェクトがパブリック インターフェイスを通じて表示される方法で変更されない場合です。別の例としては、最初に要求されたときに値を計算し、結果をキャッシュするクラスがあります。

c++11 では、mutableラムダを使用して、値によってキャプチャされたものが変更可能であることを示すことができます (デフォルトでは変更できません)。

int x = 0;
auto f1 = [=]() mutable {x = 42;};  // OK
auto f2 = [=]()         {x = 42;};  // Error: a by-value capture cannot be modified in a non-mutable lambda

おすすめ記事