NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

(C++)コンパイル時の最適化

差出人: "DD."さん
送信日時 2006/01/16 13:23
ML.NO [bugc:0083]
本文:

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 だとやっぱりダメみたいですね。
一応書き込みしました。

#最近書き込みがない^^;

添付:
 読み込み中...

このメールには下記のメールが返信されています:

【PR】お小遣いブログレシピ無料ホームページゲーム

更新順メールリスト