ある型 T があって, T のオブジェクトが const 修飾されているならば,そのオブジェクトに対する(const_cast をはじめとする const 性除去の構文を除く)あらゆる有効式がそのオブジェクトに関してスレッドセーフである,っつー性質を考える.
この性質は,言い換えると,あるスレッドが const 修飾された T のオブジェクト,もしくはそれへの参照・ポインタを持っていた場合,そのスレッドはどう頑張ってもそのオブジェクト,もしくはそのオブジェクトが直接・間接に参照するオブジェクトに対する (Readers/Writer Lock の文脈でいうところの) Reader にしかなれない,というもの.
この性質は,さらに言い換えると, T に対する const 修飾が単に論理的な定数性だけではなくて厳密にビット列の定数性を保証する,というもの.
C++ では,オブジェクトに対する const 修飾は
- クラスが他のオブジェクトへの非 const なポインタを持っていて, const メンバ関数内でそのオブジェクトへの非 const メンバ関数を呼び出す(定数性が伝播してない)
- クラス内部で mutable 指定されたメンバを持っている
- const_cast または C スタイルのキャストで const 修飾子を除去している
- この性質を満たさない型のオブジェクトを直接または間接に保持もしくは参照している
などの理由により,必ずしも const 修飾がビット列の定数性を意味しない場合があるので,ある型がこの性質を満たすかどうかは(特にマルチスレッドの文脈で)非常に重要だと思われる.
で,問題はこの性質を一言で表現する言葉が欲しい,というもの.
この言葉が一言あるだけで thread safety に関する documentation が格段に楽になるんだけれど,なんか良い言葉にゃいかにゃー.
仮に今,上記の性質を表す言葉が「イヌ耳大好き」であると仮定しよう
そうすると,ある型の thread safety に関する documentation をしようとしたときに,
/** @note * <b>Thread Safety</b> * このクラスのオブジェクトが const 修飾されているならば,そのオブジェクトに対する * (const_cast をはじめとする const 性除去の構文を除く) あらゆる有効式が * そのオブジェクトに関してスレッドセーフである. */ class C { ..... };
という意味不明かつ長ったらしいドキュメントを書かなければならなかったものが,
/** @note * <b>Thread Safety</b> * このクラスはイヌ耳大好きである. */ class C { ..... };
と,圧倒的に楽になるはずなのだ.だだだ.
/** @note * <b>Thread Safety</b> * このクラスのオブジェクトに対する const 修飾は,ビット列に対する定数性を意味する. */ class C { ..... };
だと,「え?これ thread safety と何の関係が?」となってしまうかも知れにゃいし.