我正在试验模板部分专门化,我得到了以下代码:
template <typename T>
struct X {
using type = T;
};
template <typename T>
struct Y {};
template <typename T>
struct Y<typename X<T>::type> {};
Clang、GCC和MSVC似乎抱怨在这种上下文中模板形参不可演绎。然而,部分专门化永远不应该匹配。因此,每个特化都依赖于主模板定义。
我找不到规范中禁止此操作的章节。
template <typename T>
struct Y<typename X<T>::type> {};
并不比主类模板更专门化。
template <typename T>
struct Y {};
换句话说,它接受主类模板接受的类型集合,而不是它的子集。
编辑:
感谢@Jarod42在评论中的澄清,程序是病态的,因为部分专门化的参数是不可演绎的,而不是因为它不是更专门化的。程序在实例化X
时失败,而在实例化Y
时失败。