非スタティックデータメンバーの宣言にmutable
指定子を使用すると、オブジェクトの残りの部分がconstとして扱われるかどうかにかかわらず、データは変更可能です。この事実から、mutable
指定子がconst
修飾子と同じ種類のものであり、これは真実ではないという印象を受け取りやすいでしょう。実際には、言語はストレージクラス指定子としてmutable
指定子を分類します。 mutable
には保存期間が指定されていないため、これは非常に直感的です。変更可能な指定子が記憶域クラス指定子に分類されますが、修飾子ではないのはなぜですか?
このデザイン決定の背景には何がありますか?
mutable
が修飾子であったと思われるよりも、それほど論理的ではないと思われるものは何ですか?
これをストレージクラス指定子にする利点は何ですか?
あなたの質問はN4140の[dcl.stc]で直接答えられます: 'クラスデータメンバの変更可能な指定子は、そのクラスのオブジェクトに適用されるconst指定子を無効にし、変更可能なクラスメンバの変更を許可しますオブジェクトはconst(7.1.6.1)です。 –
'const'と' volatile'は型の一部です。 'mutable'はそうではありません。 –
実装では、constオブジェクトを読み込み専用メモリに入れることができますが、変更可能なメンバは明示的に配置することはできません。ですから、もしあなたがちょっと覗き込んだとしても、それはストレージと全く無関係ではありません。 –