2011年11月25日金曜日

参照メンバへのmutable指定

↓のサイトでも取り上げられているように、現行のSystemCのソースコードにはクラスの参照メンバにmutable指定している記述がある。これは規格違反のため、最新のGCCやclang等でコンパイルできない。
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()は有効な記述である。

class C{
  int *ptr;
  void f0()const{
    ptr = NULL; //NG
  }
  void f1()const{
    *ptr = 0;   //OK
  }
};

つまりconstなメンバ関数からメンバ変数ptrはint *const ptr;として見える。
注:const int *ptr;ではない。
また、mutable int *ptr;にするとf0()もOKになる。
mutable int *const ptr;は規格違反である。
これはmutable const int i;が無効なのと同じ。
constなメンバ関数からはポインタが何を指すかを変えてはならない、ということだろう。
一方、参照はそもそも初期化時に指定したオブジェクトを指すだけで、
途中で指す対象を変更することができない。
したがってmutableの指定は無効と考えられる。
ちなみにOSCIもSystemC-2.2の規格違反な記述については認識していて、
次のリリースでは解消される見込みのようだ。

引越し

Nucleusで自前でblog運用するのはどうも面倒なので引越し。
http://blog.something-like-that.net/の内容はいずれこっちに移さなきゃ。
幸か不幸か投稿数も少ないし。