件名:

(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メールには下記のMLメールが返信されています:
[bugc:0084] Re: (C++)コンパイル時の最適化  (yikeさん)
 読み込み 中...
<<0082:「史上最悪のソフトウェアバグ」ワースト10 0084:Re: (C++)コンパイル時の最適化>>
MLメール表示切替 トピック表示 メール表示
MLメール一覧

MLトピック検索:
MLメールの詳細(メール表示)
MLメール表示切替 トピック表示 メール表示
MLメール一覧

メーリングリストでつながる!ひろがる!みんなのHappyコミュニティ!

詳細検索
NOEMBLEM/エンブレムが設定されていません。
バグコレ(C言語) (48)
 
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
メンバーリストは非公開です。
メンバーの日記/フォト/動画
メンバーの投稿は非公開です。
 読み込み中...