http://lsifrontend.blog100.fc2.com/blog-entry-186.html
理由はC++03の規格書7.1.1.8に以下のように書かれているため。
The mutable specifier can be applied only to names of class data members (9.2) and cannot be applied to names declared const or static, and cannot be applied to reference members.
これだけだと発展がないため、自分なりの解釈を書いてみる。
たとえば以下のようなクラスだと
f0()は規格違反だが、f1()は有効な記述である。
つまりconstなメンバ関数からメンバ変数ptrはint *const ptr;として見える。class C{ int *ptr; void f0()const{ ptr = NULL; //NG } void f1()const{ *ptr = 0; //OK } };
注:const int *ptr;ではない。
また、mutable int *ptr;にするとf0()もOKになる。
mutable int *const ptr;は規格違反である。
これはmutable const int i;が無効なのと同じ。
constなメンバ関数からはポインタが何を指すかを変えてはならない、ということだろう。
一方、参照はそもそも初期化時に指定したオブジェクトを指すだけで、
途中で指す対象を変更することができない。
したがってmutableの指定は無効と考えられる。
ちなみにOSCIもSystemC-2.2の規格違反な記述については認識していて、
次のリリースでは解消される見込みのようだ。