我注意到当实例化被typedef
'ed 时,类模板中的静态断言不会被触发。
#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 上尝试了这段代码。这种行为正常吗?编译器应该在什么时候验证静态断言?我想涉及到两阶段查找,但是 typedef 不应该触发第二阶段吗?