少し前に、クラスのデータ メンバーを キーワードでマークするコードを見つけました。私が見る限り、これは- 修飾メンバー メソッドmutable
でメンバーを変更できるようにするだけです。const
class Foo
{
private:
mutable bool done_;
public:
void doSomething() const { ...; done_ = true; }
};
これは this キーワードの唯一の用途ですか、それとも見た目以上に意味があるのでしょうか? それ以来、私はこの手法をクラスで使用し、 を としてマークして、boost::mutex
スレッドmutable
のconst
安全性のために関数がそれをロックできるようにしていますが、正直言って、ちょっとしたハックのように感じます。
ベストアンサー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