2

重複の可能性:
C++ 'mutable' キーワード C++ 'mutable' キーワード
をいつ使用しましたか?

私はそれが何mutableを意味し、どのように使用されているかを理解しています. 私が知りたいのは、その存在の背後にある本当の動機は何ですか. this唯一の動機は、メンバー関数の不変性をバイパスすることではないとconst思います。むしろ、それ以上の何かがあると思います。
設計が不十分なシステムの問題を回避するための単なる手段ではないと思いますか? またはそれは?

元の質問の明らかな分岐点はmutable、優れた設計であっても、いつ使用するのが理にかなっているのですか?

4

4 に答える 4

12

動機this、実際にはinconstメソッドの不変性 (構文レベル) をバイパスすることです。これconstは、コンパイラによって構文的に検証されるセマンティック チェックです。意味的にオブジェクトの状態を変更しない操作はである必要がありますconstが、場合によっては、実装でサブオブジェクトを変更する必要があり、この特定のメンバーがオブジェクトの状態mutableの一部ではないため、コンパイラに伝える構文ツールです。メソッド内で変更できます。const

がないmutableと、たとえば、オブジェクトの状態を意味的に変更しないアクセサーにメンバー変数として格納されているミューテックスをロックできませんでした。これは、コンパイラの構文チェックで、ミューテックスを変更していると不平を言うためです。実装の詳細 (最適化、スレッド セーフ) が、オブジェクトの可視状態を変更しないメソッドでメンバー変数を変更することを意味する、メモ化のような他の動機付けの例があります。

于 2012-04-18T15:15:18.090 に答える
8

mutableビットごとの const を論理 const から分離する部分です。基本的に、コンパイラが実装するものはビットごとの const と呼ばれます。const 関数で実際のオブジェクトのビットを変更しようとするとエラーが発生しますが、それ以外の場合はエラーが発生しません。クラスを作成するときは、論理 const を実装する必要があります。const 関数は、オブジェクトの監視可能な値を変更しません (クラスの作成者が監視可能な値を定義します)。ほとんどの場合、これは、変更できる場合でも (たとえば、ポインターを介してアクセスされる値の一部)、変更しないという問題ですが、実際のオブジェクト (コンパイラーによって認識される) に「ビット」が存在することがよくあります。監視可能な値の t 部分: 遅延計算されたキャッシュされた値は古典的な例ですが、他の例を想像することもできます: 侵入型のリンク リスト内の要素、たとえば、

于 2012-04-18T15:54:37.103 に答える
5

一般的なニーズの1つは、メモ化を実装することです。外部の世界では、関数呼び出しはオブジェクトの状態を変更していませんが、内部的にはメモ化キャッシュを更新する必要があります。キャッシュを特定するmutableことでそれが可能になります。

于 2012-04-18T15:14:32.120 に答える
0

動機は、の不変性をバイパスすることですthis。ポイントは、変更する必要があるオブジェクトの一部が存在する可能性があるが、オブジェクトの可視状態には寄与しないということです。変更は、実際にはインターフェイスに表示されるべきではない実装の詳細にすぎない場合があります (変更される可能性があります。

例はmutices、データ構造のロックです。const構造体の読み取り中に他のスレッドが構造体を変更していないことを確認するために、メソッドに対しても構造体をロックする必要がある可能性があります。メソッドがオブジェクトを変更しない場合は、論理的にそうあるべきですconst(オブジェクトのロックとロック解除によって行われた変更を公開するのはばかげているようです)。そのため、ミューテックスを作成する必要がありますmutable

于 2012-04-18T15:21:51.097 に答える