15

非スタティックデータメンバーの宣言にmutable指定子を使用すると、オブジェクトの残りの部分がconstとして扱われるかどうかにかかわらず、データは変更可能です。この事実から、mutable指定子がconst修飾子と同じ種類のものであり、これは真実ではないという印象を受け取りやすいでしょう。実際には、言語はストレージクラス指定子としてmutable指定子を分類します。 mutableには保存期間が指定されていないため、これは非常に直感的です。変更可能な指定子が記憶域クラス指定子に分類されますが、修飾子ではないのはなぜですか?

このデザイン決定の背景には何がありますか?

mutableが修飾子であったと思われるよりも、それほど論理的ではないと思われるものは何ですか?

これをストレージクラス指定子にする利点は何ですか?

+0

あなたの質問はN4140の[dcl.stc]で直接答えられます: 'クラスデータメンバの変更可能な指定子は、そのクラスのオブジェクトに適用されるconst指定子を無効にし、変更可能なクラスメンバの変更を許可しますオブジェクトはconst(7.1.6.1)です。 –

+2

'const'と' volatile'は型の一部です。 'mutable'はそうではありません。 –

+1

実装では、constオブジェクトを読み込み専用メモリに入れることができますが、変更可能なメンバは明示的に配置することはできません。ですから、もしあなたがちょっと覗き込んだとしても、それはストレージと全く無関係ではありません。 –

答えて

11

cv-qualifierオブジェクトのセマンティクスを変更/制限します。 mutableはありません。それはそれタイプ指定子ない供述指定子作ることにしました

したがって

ポインタの変換などについて複数の段落を必要としながら、それはタイプの一部であることは、事実上すべてのシナリオで余分だろう。 constはオブジェクトを書き込み保護されたメモリに入れることができるので、mutableはオブジェクトをそのような記憶領域に入れないことがあり、記憶クラス指定子であることが示唆されます。

+0

私は仮説的な 'mutable int C :: *'( 'mutable'が指される型の一部である)を仮定することができます。これは、' int * mutable p; 'の代わりに' mutable int * p; 'const C'オブジェクトの変更可能な' int'サブオブジェクトをポインタへのポインタ構文を介して変更するのに使用されますが、確かにコストは利益よりはるかに大きくなります。 –

+4

downvoterは彼女が望んだと分かったことを説明できますか? – Columbo

関連する問題