12

このコード スニペットを検討してください。

template<bool b>
struct other
{
    static const bool value = !b;
};

template<bool b>
struct test
{
    static const bool value = b || other<b>::value;
};

int main()
{
      bool value = test<true>::value;   
}

other<true>インスタンス化がまったく不要と思われる上記のような状況で、コンパイラはインスタンス化しますか? または、私が構文 を書いたからといって、 ?other<b>::valueの値の計算にまったく貢献しないという事実に関係なく、コンパイラはそれをインスタンス化する必要があります。test<true>::value

a) 標準で何が要求されているか、b)さまざまなコンパイラで実際に実装されているものは何ですか? 規格の関連セクションを歓迎します。

4

2 に答える 2

9

C++ 仕様によると、セクション $14.7.1/4:

「完全に定義されたオブジェクト型を必要とするコンテキストでクラス型が使用される場合、またはクラス型の完全性がプログラムのセマンティクスに影響を与える場合、クラス テンプレートの特殊化は暗黙的にインスタンス化されます。特に、型がクラス テンプレートの特殊化は、オーバーロードの解決に関係しています」

ショートサーキットで説明した場合、値の静的メンバーを見つけるために内部を調べているため、クラスは完全な型を持つ必要があります。これにより、コンパイラは式を短絡できなくなります。

実際に実際に何が起こるかについては、インスタンス化を行わないとコンパイラがどのように回避できるかがわからないため、わかりません。たとえば、 のインスタンス化が次のother<b>ようになったとします。

template <bool B> struct other {
    typedef int value;
};

other<b>ここでは、 ::value は値ではなく型であるため、プログラムの形式が正しくありませんが、コンパイラは実際にインスタンス化を行わないとエラーを診断できませんでした。

于 2011-01-05T04:07:51.617 に答える