10

次の (不適切な形式の) プログラムがあるとします。

struct A
{
    A(int, int)
    {
    }
};

template <typename T>
class B
{
    B()
    {
        if (sizeof (T) == 1)
        {
            throw A(0); // wrong, A() needs two arguments
        }
    }
};

int main()
{
    return 0;
}

GCC はこのプログラムをエラーなしでコンパイルしますが、clang++ はエラーで拒否します。

  1. テンプレートがインスタンス化されていないため、GCC のバグではないと言うのは正当ですか?
  2. このエラーを見つけるためにclangはどのような魔法を行いますか?
  3. C++ 標準は、これらの状況について何と言っていますか?
4

2 に答える 2

11

テンプレートは、使用時にインスタンス化されます。ただし、定義時にコンパイルする必要があります。コードA(0)は名前を使用しますがA、これはテンプレートパラメータに依存しないTため、テンプレートが定義されたときに解決する必要があります。これは、2フェーズルックアップと呼ばれます。clangがエラーを見つける方法は、それを見つけA(0)たらすぐに呼び出しを解決しようとすることです。

私のバージョンのGCCも、。を使用しても、このコードをサイレントにコンパイルします-pedantic-errors。C++03とC++11はどちらも、プログラムの形式が正しくない場合でも診断は不要であると述べているため、GCCに準拠しています。これは、C++03では14.6/7、C++11では14.6/8です。

テンプレート定義に対して有効な特殊化を生成できず、そのテンプレートがインスタンス化されていない場合、テンプレート定義の形式が正しくないため、診断は必要ありません。

于 2013-01-07T10:20:32.423 に答える
5
  1. はい。有効な特殊化が存在しないが、テンプレートがインスタンス化されていない場合 (ここのように)、プログラムの形式は正しくありませんが、診断は必要ありません (14.6/8)。したがって、clang と g++ の両方が正しいです。

  2. テンプレート宣言では、clang は g++ よりも多くのチェックを行います。

  3. 上記を参照。

于 2013-01-07T10:32:03.313 に答える