除了@rodrigo 的回答(他更快……),
什么时候执行静态断言?我可以将它放在模板中的任何位置并针对每个模板实例进行评估吗?它可以用来将模板参数限制为类的特定子类型吗?
很不幸的是,不行。例如,无论模板如何,static_assert(false, "bummer");
都始终执行 a。如果您想(部分)专门化模板,这尤其会失败。
标准(§7.4)说:
[如果条件static_assert
是false
]程序格式错误,并且生成的诊断消息(1.4)应包括字符串文字的文本,[…]
不幸的是,这很不具体,但这种缺乏特异性实际上正是static_assert
它不依赖于模板类型时的行为方式。
您需要使条件static_assert
依赖于模板参数以将其执行绑定到特定的模板参数。
所以以下将失败:
template <typename T>
struct some_type {
static_assert(false, "T must be a pointer type");
};
template <typename T>
struct some_type<T*> {
// …
};
最后,我衷心推荐你阅读 Marthino 关于更多类型特征的文章,该文章更详细地介绍了这个过程,并给出了如何优雅地解决许多与 trait 相关的问题的提示。