Luc*_*lle 5 c++ templates static-assert
我注意到在实例化时不会触发类模板中的静态断言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;
Run Code Online (Sandbox Code Playgroud)
此代码编译没有错误.如果我尝试创建一个实例,那么断言就会失败:
t obj; // error: static assertion failed: "should fail"
Run Code Online (Sandbox Code Playgroud)
最后,如果我用条件替换条件false,即使我没有实例化类模板,断言也会失败:
template <typename T>
struct test_assert
{
static_assert( false, "always fails" );
};
Run Code Online (Sandbox Code Playgroud)
我在gcc-4.5.1和gcc-4.7.0上尝试了这段代码.这种行为是否正常?编译器什么时候应该验证静态断言?我想涉及两阶段查找,但是typedef不应该触发第二阶段吗?
我在gcc-4.5.1和gcc-4.7.0上尝试了这段代码.这种行为是否正常?
是
编译器什么时候应该验证静态断言?
这是个有趣的问题.在实例化期间,这将是非依赖名称的第一阶段查找,以及依赖于模板参数的断言的第二阶段查找阶段.
猜测涉及两阶段查找,但是typedef不应该触发第二阶段吗?
模板是按需编译的,typedef只是为模板创建一个别名,而不会触发实例化.请考虑以下代码:
template <typename T> class unique_ptr;
typedef unique_ptr<int> int_unique_ptr;
Run Code Online (Sandbox Code Playgroud)
模板仅被声明,但是对于typedef来说就足够了,因为它只为该类型生成别名.另一方面,如果您创建该类型的对象,则必须实例化模板(再次按需,将不会实例化成员函数).
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |