考虑以下程序:
template<template<typename ...> class>
struct foo {};
template<template<typename> class C>
struct foo<C> {};
int main() {}
Run Code Online (Sandbox Code Playgroud)
Clang拒绝了它的错误:
类模板部分特化不会专门化任何模板参数
即使在最新的clang 7.0 HEAD中,请参见此处的演示.但是,gcc接受了它.
请参阅[temp.class.spec],其中陈述了部分特化的规则,我找不到任何禁止该模板的部分特化的东西.特别是,专业化确实更专业,错误消息看起来不正确.
编辑:
但是,gcc的行为也是异常的,请考虑以下程序:
#include <iostream>
template<template<typename ...> class>
struct foo { void show() { std::cout << "Primary.\n"; } };
template<template<typename> class C>
struct foo<C> { void show() { std::cout << "Specialized.\n"; } };
template<class...> struct bar {};
int main() {
foo<bar> f;
f.show();
}
Run Code Online (Sandbox Code Playgroud)
事实证明,gcc在这种情况下使用专用版本,请参见此处.
现在我想问:
是标准允许的这种局部专业化吗?
哪个编译器是正确的?(一个/全部/没有?)