私は、インスタンス化がtypedef
'であるときにクラステンプレートの静的アサーションがトリガされないことに気付きました。typedefでstatic_assertをトリガーする必要がありますか?
#include <type_traits>
template <typename T>
struct test_assert
{
static_assert(std::is_same< T, int >::value, "should fail");
};
typedef test_assert<float> t;
このコードはエラーなしでコンパイルされます。私はインスタンスを作成しようとすると、アサーションは失敗します。
t obj; // error: static assertion failed: "should fail"
を最後に、私はfalse
と条件を置き換えた場合、アサーションは私はクラステンプレートインスタンス化していない場合でも失敗:
template <typename T>
struct test_assert
{
static_assert(false, "always fails");
};
を
gcc-4.5.1とgcc-4.7.0でこのコードを試しました。この動作は正常ですか?コンパイラは何時に静的アサーションを検証することになっていますか?私は2フェーズのルックアップが関係していると思いますが、typedefが第2フェーズをトリガーすべきではないでしょうか?
+1。素晴らしい質問。 :-) – Nawaz