const はクラスの設計にダイレクトに関わってくる。一般的に、非 const 参照以外の値を返すメソッドは、全て const であることが望ましい。それ以外は全て void で統一する。
2010-04-12 23:17:06ただし、世の中には const な void メソッドも存在するので、そういう場合もあるということは認識しておく必要がある。詳しくは Exceptional C++
2010-04-12 23:18:50簡単に言えば、キャッシュを予め計算しておくようなメソッドは、 void を返す const メソッドにするのが自然。
2010-04-12 23:19:43キャッシュと言うのは処理の詳細であって、インターフェイスには現れない部分。そういうところは抽象化で真っ先に消されるよね。
2010-04-12 23:24:48どのように処理をしているかには興味がなくて、何を処理してるか、というのだけわかればいい。「何」の部分で不変であるなら、具体的な処理によらず、それは const にするべき
2010-04-12 23:26:09ただ、マルチスレッドを考えると、それだけじゃ足りない。意味的に const であっても、処理中にdirtyな状態が有るなら、それはマルチスレッド的な意味で const じゃない。
2010-04-12 23:35:00マルチスレッド的な意味で const か否がが分かれば、ロック関連でスムーズに処理出来る。 まぁ、その辺はユーザが手で対処してやればいいんですが。スレッドに関するポリシー持たせて。でも、出来ればコンパイラによろしくやって欲しいなぁ、と。
2010-04-12 23:38:59@SubaruG Javaは、マルチスレッドでも安全な不変性を保証することができます。final修飾されたフィールドの値は、コンストラクタ終了後は他スレッドから見た場合でも必ず不変です。
2010-04-13 01:08:33@SubaruG しかし、C++0xではJavaのような方針を採りませんでした。Javaの方法では暗黙的なメモリバリアをあちこちに埋め込む必要があるので、ゼロオーバーヘッド原則に反するからでしょう。
2010-04-13 01:09:22@yamasa 論理的な const 性と、物理的な const 性はぜんぜん違うものですから( what と how の違いですね)、今の論理的な const はそのままで、実装補助として新しい物理的な概念が有るといいな、って話ですー。
2010-04-13 01:15:37