让我们考虑一个仅特殊化有效的模板类的基本情况:
template<bool B>
struct OnlyTrue; // { static_assert(B != B, "Only true!"; };
template<> struct OnlyTrue<true> { static constexpr bool value = true; };
static constexpr bool b = OnlyTrue<true>::value;
上面的一个示例有效地有效地禁止了OnlyTrue<false>
在程序中的使用。另一种选择是取消注释static_assert
-使其完整,尽管不可编译。这种方法的好处是,如果以不允许的值实例化,将生成更加人性化的诊断。 (有关同一技术的更有意义的示例,请参见Mapping an integral template parameter value onto a primitive type。
现在要问的是-最新的C ++标准中,[temp.res] / 8是否会是8.1:
该程序格式不正确,无需诊断,如果:...没有有效 可以为模板或模板的子语句生成专门化 模板中的
constexpr if
语句,而该模板不是 实例化...
使以上代码段格式错误,不需要诊断吗?