| 件名: | (C++)コンパイル時の最適化 |
|---|---|
| MLNo. | [bugc:0083] |
| 差出人: | "DD."さん <daichan5692…> |
| 送信日時: | 2006/01/16 13:23 |
| 本文: |
DD.です
特に、これで引っかかるという人はあまりいないと思います。 一応確認までにと思いまして。 以下のコードについて: struct Hoge { static void hoge() {} }; struct Foo { static void foo() {} }; template < class T, bool isHoge > class some { public: void func() { if ( isHoge ) { T::hoge(); } else { T::foo(); } } }; int main() { some< Hoge, true > h; some< Foo, false > f; h.func(); f.func(); } このコードはエラーとなります。 Hoge にはメンバ関数 foo() はなく、Foo にはメンバ関数 hoge() がないためです。 ただ、コンパイル時には some< Hoge, true > により、func() は void func() { if ( trueだということはコンパイル時にはわかっている ) { Hoge::hoge(); } else { ... } // ※ } ※部は適用されることはないことがわかっているのでコンパイルの最適化時に省 かれる(??) と、するならばコンパイルエラーにはならないのではないか? とする場合、逆にも同じことが言えるのではないか? これに関して「Modern C++ Design」第2章より 「if-elseステートメントでは、if によって判定される条件が"コンパイル時に 明らかになっている場合でも"双方の分岐が正しくコンパイルできることを保証 しななければならない」 らしいです。 #ifdef とかなら問題ないですが、普通の if だとやっぱりダメみたいですね。 一応書き込みしました。 #最近書き込みがない^^; |
|---|---|
| 添付: |
このMLメールには下記のMLメールが返信されています:
読み込み
中...| <<0082:「史上最悪のソフトウェアバグ」ワースト10 | 0084:Re: (C++)コンパイル時の最適化>> |










