5

我注意到当实例化被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 不应该触发第二阶段吗?

4

1 回答 1

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 来说就足够了,因为它只为该类型生成一个别名。另一方面,如果创建类型的对象,则必须实例化模板(再次按需实例化成员函数)。

于 2012-06-28T19:37:36.947 回答