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

メールの詳細(トピック表示)

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

投稿者:"DD."さん  2006/01/16 13:23  MLNo.83   [メール表示]

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

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


 読み込み中...

  • MLNo.84   yikeさん  (0) 2006/01/16 16:42  [メール表示する]
    池田です。
    土日風邪引いて寝込んでました orz

    > DD.です
    >
    > 特に、これで引っかかるという人はあまりいないと思います。
    > 一応確認までにと思いまして。
    > ...
    > if ( isHoge ) { T::hoge(); } else { T::foo(); }
    > ...
    > some< Hoge, true > h;
    > some< Foo, false > f;
    >
    > このコードはエラーとなります。

    インタプリタ型の言語と混同してしまうと引っかかるかもしれませんね。


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

    そうですね〜、そろそろ卒業研究で論文を書き始めなければいけない時期なので
    主にバグ投稿してくれていた方がコードを書かなくなったためでは
    ないかなと考えられます。
    私自身もはやく論文を仕上げないと・・・。
    まだ一ページも書けてない orz

    -------------------------------------
    池田 祐一

    徳島大学工学部 電気電子工学科
    木内研究室 学部4年
    E-mail: yike@…
    -------------------------------------



メールへの返信はMLのメンバーしかできません。

更新順メールリスト

これが憧れの4LDK超/SUUMO