mutableキーワードは、オブジェクトの上にドレープするベールを突き刺す方法ですconst。オブジェクトへの const 参照またはポインターがある場合、いつ、どのようにマークされているかを除いて、そのオブジェクトを変更することはできませんmutable。
const参照またはポインターを使用すると、次のことが制限されます。
- 可視データ メンバーの読み取りアクセスのみ
- としてマークされたメソッドのみを呼び出す権限
const。
例外により、mutableマークされたデータ メンバーを書き込みまたは設定できるようになりましたmutable。それは、外から見える唯一の違いです。
内部const的には、可視のメソッドは、 とマークされたデータ メンバーにも書き込むことができますmutable。本質的にコンストベールは包括的に貫かれています。mutableが概念を破壊せずconst、有用な特別な場合にのみ使用されることを保証するのは、完全に API 設計者次第です。キーワードは、mutableこれらの特殊なケースの対象となるデータ メンバーを明確にマークするので役立ちます。
実際にはconst、コードベース全体で執拗に使用できます (基本的に、コードベースにconst「病気」を「感染させたい」)。この世界では、ポインターと参照にはconstほとんど例外がなく、推論と理解が容易なコードが生成されます。興味深い余談については、「参照透過性」を調べてください。
mutableキーワードがないと、最終的にconst_castは、それが許すさまざまな便利な特殊なケース (キャッシング、参照カウント、デバッグ データなど) を処理するために使用せざるを得なくなります。残念ながら、使用しているオブジェクトの保護を APIクライアントに強制的に破棄させるconst_castよりも、はるかに破壊的です。さらに、広範な破壊を引き起こします。 const ポインターまたは参照を使用すると、可視メンバーへの自由な書き込みおよびメソッド呼び出しアクセスが可能になります。対照的に、API 設計者は例外をきめ細かく制御する必要があり、通常、これらの例外はプライベート データを操作するメソッドに隠されています。mutableconstconstconst_castmutableconstconst
(注意: データとメソッドの可視性について何度か言及しています。ここで説明するオブジェクト保護のまったく異なるタイプである public と private または protected としてマークされたメンバーについて話しているのです。)