这是对this问题的跟进。
请考虑以下代码:
#include <type_traits>
template<typename T, typename... P, typename U = std::enable_if_t<std::is_integral<T>::value>>
void f() { static_assert(sizeof...(P) == 0, "!"); }
int main() {
f<int>();
}
它编译,但根据[temp.res]/8,它是不正确的,不需要诊断,因为:
可变参数模板的每个有效特化都需要一个空模板参数包
现在考虑一下稍微不同的例子:
#include <type_traits>
template<typename T, typename... P, typename U = std::enable_if_t<std::is_integral<T>::value>>
void f() { static_assert(sizeof...(P) == 0, "!"); }
template<>
void f<int, int>() { }
int main() {
f<int, int>();
}
在这种情况下,存在一个有效的完全显式专门化,参数包不为空 这足以说代码不再格式错误吗?
注意:我没有寻找替代方法,例如将std::enable_if_t
放入返回类型或类似内容。
答案 0 :(得分:4)
[temp.res] / 8讨论模板声明,而不是实体。也就是说,它讨论主要模板和部分特化单独;这些&#34;模板&#34; 每个必须具有符合规则的有效专业化。否则,该段中的第一个子弹必须以相同的方式解释,这绝对不能赋予它预期的含义。
template <typename T>
void f() {T+0;} // wouldn't be allowed to diagnose this, because there could be an
// explicit specialization that doesn't contain this statement...?