【发布时间】:2019-02-10 00:20:50
【问题描述】:
在 C++14 草案标准中,[temp.param]/11 说:
如果是主类模板或别名模板的模板参数 是一个模板参数包,它应该是最后一个模板参数。
如果您尝试编译以下模板,那么编译器会报错。
template< typename ...Args, void(*f)(Args...) > // ERROR
struct Bar
{};
但是在这种情况下它是如何工作的呢?
template< typename F, F >
struct Bar;
template< typename ...Args, void(*f)(Args...) > // OK ???
struct Bar< void(*)(Args...), f >
{};
我可以看到它与作为专业化类模板的一部分有关,但是为什么?
规则明确指出它适用于 primary 类模板。这是否意味着专业化规则会发生变化?
我试图在标准中搜索这个,但找不到任何东西。能否请您对此有所启发。
【问题讨论】:
-
我相信有人会想出更详细的答案,但这主要是你已经得到的:模板特化既不是主类模板也不是别名模板。
标签: c++ templates c++14 variadic