在专业化的情况下,检查保护参数包是否导致格式错误的程序?

时间:2016-11-28 10:30:04

标签: c++ c++11 templates language-lawyer variadic-templates

这是对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放入返回类型或类似内容。

1 个答案:

答案 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...?