【发布时间】:2017-06-03 14:45:51
【问题描述】:
在模板中提供static_assert 通常很有帮助。在模板根本不应该以某种方式实例化的情况下,我经常这样做
template<typename T, typename = void>
struct S
{
static_assert(false, "Unconditional error");
static_assert(sizeof(T) != sizeof(T), "Error on instantiation");
};
template<typename T>
struct S<T, std::enable_if_t<std::is_integral_v<T>>>
{
// ...
};
第一个static_assert 将立即失败,即使没有S 的实例化,而第二个将成功,如果没有实例化会产生主模板。
第二个static_assert 显然是一个重言式,但它“依赖”于T 以达到预期的效果。但这能保证吗?是否允许编译器评估这些重言式?
【问题讨论】:
-
但是可能没有定义这样的特化,编译器在处理反重言式时不必知道未来的代码......
-
恕我直言,代码的同一部分不能同时根据(可能是遥远的)上下文形成良好和错误的形式......这会给已经重载的编译器带来额外的困难......
-
@bolov 如果我现在可以结束这个问题:(
标签: c++ language-lawyer static-assert