https://twitter.com/kinaba のログ (twilog の方が便利です。)
.@NyaRuRu さんの今日のブログ読み中。「このオブジェクト(のみ)を俺は書き換えない=C++のconst」「このオブジェクト(から辿って辿りつくもの全て)を俺は書き換えない=Dのconst」「このオブジェクト(から辿りつくの全て)を誰も書き換えない=Dのinvariant」 | |
と考えた時の"C++のinvariant"に当たるものが時々欲しくなるなーと思っている。ブログ読み中と言いながらあんまり中身に関係なかった | |
「C++では "int** p=0; const int**q = p;" はコンパイルエラーになります。なぜでしょう?」が、シンプルだけど、C++のconst周りだと一番難しかったというか意表を突かれた | |
.@NyaRuRu 仕様としては、constとして配置した値のコンストラクタでのthisを外に渡すと、そのポインタを使って操作された値はunspecified (12.1.5) になります。 | |
他のひとはどうなのかわからないですけど、自分の場合、直接 const オブジェクトを作ることってあんまりしないかなあと。使うのは const& か const* か。その使い方に限っている限りでは、そんなに直感に反する動きはしないような… | |
.@NyaRuRu はい、"if the value of the object or ~~any of its subobjects~~ is accessed through thisから作った以外の左辺値" が unspecified になる条件でした | |
後半も原文を引用すると "through an lvalue that is not obtained, directly or indirectly, from the constructor's this pointer" | |
ところでD言語のinmmutable(旧invariant)オブジェクトもコンストラクタにmutableなthisポインタがやってきて、コンパイラ先生に怒られずに外に持ち出せるんですが、これWalter的にはどうなんでしょうか… |