私の質問は、次のコードが有効であるかどうか、次のとおりです。static_assertは
template<int i> class Class
{
static_assert(sizeof(i) == 0, "Class instantiated with i != 1");
};
template<> class Class<1> {};
このスニペットはg++
でコンパイルされます。しかしclang++
はstatic_assert
によってトラップされています
error: static_assert failed "Class instantiated with non-int type"
代わりint
template<typename T> class Class
{
static_assert(sizeof(T) == 0, "Class instantiated with non-int type");
};
template<> class Class<int> {};
の種類を使用するテンプレートは、両方のコンパイラで受け入れられています。関数テンプレートにはまったく同じパターンが適用されます。
open-std.org::Non-dependent static_assert-declarationsが見つかりましたが、私のstatic_assert
はテンプレートパラメータに依存しているため適用されていません。
あなたはgodbolt.org
EDIT上で説明した動作を確認することがあります。ヨハン・ランドバーグはコメントで指摘するように、私の質問が間違っています。確かにsizeof(i)
はテンプレートパラメータに依存しません。また、R.Sahuは完全に正しいです:それはi != 1
を主張する方がはるかに意味があるでしょう。このために、両方のコンパイラがコードを受け入れます。
ただし、上の例はg++
でコンパイルされます。 open-std.org::Non-dependent static_assert-declarationsがこのケースに当てはまるので(私はこの点について間違った質問をして再び謝罪します):g++
はエラーなしでコードをコンパイルするのに実際に間違っていますか?テンプレートは、間違った型でインスタンス化されていることを主張したい場合
私はあなたが正しいとは思わない「私のstatic_assertは、テンプレートパラメータに依存しているからです。」。 sizeof(i)はiの* value *に依存しません。 –
最初の例でsizeofを使用する理由は何ですか? iはint型でsizeof(i)はsizeof(int)と同じです。おそらくアサーションで、私は直接私を使用したいと思う。 – Fabio
'static_assert(i!= 1、" i!= 1 "でインスタンス化されたクラス);を使用することを意味しましたか? –