1. ホーム
  2. c++

[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?

2022-03-17 11:38:26

質問

しばらく前に、あるクラスのメンバ変数に mutable というキーワードがあります。 私が見る限り、これは単に変数を変更するために const メソッドを使用します。

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

このキーワードの使い方はこれだけなのでしょうか、それとももっといろいろな使い方があるのでしょうか。 それ以来、私はこのテクニックを授業で使っています。 boost::mutex をミュータブルとして許可する const 関数でロックすることができますが、正直なところ、少しハックしているように感じられます。

解決方法は?

ビット単位の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