static_assert 应该用 typedef 触发吗?

2024-03-24

我注意到实例化时不会触发类模板中的静态断言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 不应该触发第二阶段吗?


我在 gcc-4.5.1 和 gcc-4.7.0 上尝试了这段代码。这种行为正常吗?

Yes

编译器应该在什么时候验证静态断言?

这是个有趣的问题。在实例化期间,这将是非依赖名称的第一阶段查找和依赖于模板参数的断言的第二阶段查找。

猜测涉及两阶段查找,但 typedef 不应该触发 第二阶段?

模板是按需编译的,typedef 只是创建模板的别名,不会触发实例化。考虑以下代码:

template <typename T> class unique_ptr;
typedef unique_ptr<int> int_unique_ptr;

模板仅被声明,但这对于 typedef 来说就足够了,因为它只生成一个alias对于类型。另一方面,如果您创建该类型的对象,则必须实例化模板(再次按需,成员函数将不会被实例化)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

static_assert 应该用 typedef 触发吗? 的相关文章

随机推荐