类模板的别名

alias of class template

本文关键字:别名      更新时间:2023-10-16

考虑一个像下面代码中的A这样的别名模板。现在设BA的别名模板

在下面的代码中,这些类模板用作结构体C的模板参数,该结构体仅为一个类型名(A)特殊化。clang -std=c++11error: implicit instantiation of undefined template 'C<B>'同时存在,表明需要B的另一个专门化。

template<int N>
using A = int;
template<int N>
using B = A<N>;
template<template<int> class I>
struct C;
template<>
struct C<A> {};
int main() {
  C<A> c;
  C<B> d; // clang error: implicit instantiation
}

为什么(如果甚至)它是-尽管不允许特殊化的别名- AB被视为不同的类模板?是否有一种解决方法允许我重命名一个冗长的模板而不会产生此问题?

这是CWG问题#1286,处理这个例子:

template<template<class> class TT> struct X { };
template<class> struct Y { };
template<class T> using Z = Y<T>;
X<Y> y;
X<Z> z;

质疑yz是否具有相同的类型。

基本上,根据标准,clang拒绝代码是正确的。所有[temp.alias]告诉我们的是:

模板id引用别名模板的专门化时,它等同于关联的类型通过将别名的类型id中的模板参数s替换为模板参数s获得模板。

因此,虽然A<X>等同于B<X>(对于所有X !),但没有措辞表明A等同于B。但在某种程度上,这没有任何意义,因为BA 应该是等效的。有一项提议的决议将这样做,但尚未获得批准。