Clang(3.8)とGNU C++(4.9)のテンプレートインスタンス化のルールは同じではないようです。ここでの例である:GNU C++とClangのテンプレートインスタンス化
#include <cstddef>
template <bool>
class Assert {
Assert(); // private constructor for Assert<false>
};
template <>
class Assert<true> { // implicit public constructor for Assert<true>
};
template <size_t N>
class A {
};
template <class T, size_t N>
T foo(A<N>) {
return T(N - 1);
}
template <class T>
T foo(A<0>) { // foo is not defined for N=0
Assert<false>();
return T(0);
}
int main(int argc, char **argv) {
foo<int>(A<3>());
return 0;
}
この最小限の例では、タイプT
と自然数N
上に一般化されるテンプレート機能、foo
を示しています。この関数はN=0
では定義されていませんので、このように使用すると、Assert
クラスを使用してコンパイラエラーを通知したいと考えています。
このコードはGNUコンパイラ(およびVisual C++ 2015も同様です)でも受け入れられますが、Clangは「プライベートコンストラクタをクラスAssert<false>
で呼び出す」というエラーを出します。
だから誰ですか?このテンプレートをインスタンス化する必要はありません。
編集:Clangの標準の解釈を受け入れることで、テンプレートのコンパイル時のチェックを強制的に行うことができますパラメーター?
したがって、 'foo'がインスタンス化されない場合でも 'Assert 'が検索され、チェックされますか?それは余分な仕事ではありませんか?とにかく、このように動作するとすれば、テンプレートパラメータに対するコンパイラのアサーションの標準的な方法は何ですか? (私はそれに応じて質問を編集しました) –
vukung
@vukung実際には、テンプレートがインスタンス化されるたびにではなく、テンプレートが定義されているときにコンパイラが 'Assert'を一度検索しなければならないので、 –
Oktalist
決して使用されないコードを書くのはなぜですか?それはあなたのための余分な仕事のように聞こえる。 – xaxxon