インスタンス化が行われると、クラス テンプレートの静的アサーションがトリガーされないことに気付きましたtypedef
。
#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 番目のフェーズをトリガーするべきではありませんか?