我注意到,当实例化为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上尝试了这段代码。这种行为是否正常?编译器什么时候应该验证静态断言?我想涉及两阶段查找,但是typedef不应该触发第二阶段吗?
答案 0 :(得分:9)
我在gcc-4.5.1和gcc-4.7.0上尝试了这段代码。这种行为是否正常?
是
编译器什么时候应该验证静态断言?
这是一个有趣的问题。在实例化期间,这将是非依赖名称的第一阶段查找和依赖于模板参数的断言的第二阶段查找阶段。
猜测涉及两阶段查找,但不应该是typedef触发器 第二阶段?
模板是按需编译的,typedef只是为模板创建一个别名,而不会触发实例化。请考虑以下代码:
template <typename T> class unique_ptr;
typedef unique_ptr<int> int_unique_ptr;
模板仅被声明,但对于typedef来说就足够了,因为它只为该类型生成别名。另一方面,如果您创建该类型的对象,则必须实例化模板(再次按需,将不会实例化成员函数)。