Template 模板参数:以下示例中应用了什么规则

Template Template Parameters: What rule is applied in the following example

假设下面的例子

using namespace std;
template <template <typename> class>
struct X 
{
   X() 
   { 
      std::cout << "1"; 
   }
};

template <typename>
struct Y {};

template <typename T>
using Z = Y<T>;

 template <>
 struct X<Y> 
 {
   X() 
   { 
      std::cout << "2"; 
    }
 };

 int main() 
 {
   X<Y> x1;
   X<Z> x2;
 }

表达式X<Y> x1很明显是使用了打印“2”的特化

第二个很奇怪。做分析 X<Z> 被翻译成 X< Y < T > >。我希望打印 "1" 。但是 运行 代码打印“2”。第二个应用了哪个规则?

The second one is strange. Doing analysis the X<Z> is translated to X< Y < T > >. I expect to print "1" . But running the code this prints "2".

没有

您已经将 Z<T> 定义为 Y<T>,因此 YZ 是同一回事。

并且 X<Z> 被翻译成 X<Y<T>> 是不正确的(并且 X<Y<T>> 无法匹配,因为 Y<T>X 的类型仅接受模板模板参数)。