使用参数包的部分专业化的行为与手动扩展的不同

Mak*_*s_F 6 c++ templates language-lawyer compiler-bug template-meta-programming

我试图理解为什么我使用两个应该与我等效的模板得到不同的行为

给定

template<template<typename...> class TT, typename T1, typename T2>
class A {};
Run Code Online (Sandbox Code Playgroud)

is_a是通用版本

template<typename T>
struct is_a : std::false_type
{
};

template<template<typename...> class TT, typename... T>
struct is_a<A<TT, T...>> : std::true_type
{
};
Run Code Online (Sandbox Code Playgroud)

is_a2是手动扩展为2种类型而不是参数包的版本

template<typename T>
struct is_a2 : std::false_type
{
};

template<template<typename...> class TT, typename T1, typename T2>
struct is_a2<A<TT, T1, T2>> : std::true_type
{
};
Run Code Online (Sandbox Code Playgroud)

我希望当 A 用 3 个参数实例化时,这 2 个版本的行为相同,但事实并非如此

参见代码编译https://wandbox.org/permlink/MjSwFLvWmH0n1QLk

我希望is_a在任何is_a2可以工作的地方工作。

这是我应该报告的编译器错误吗?

编辑

显然这适用于 clang https://wandbox.org/permlink/9n5pXUGtBa8cAvFw