通过模板别名显式实例化类

gnz*_*lbg 12 templates explicit-instantiation c++11 template-aliases

是否可以通过模板别名显式实例化模板类?

如果是这样,怎么样?否则,有人可以指向讨论和决定反对的ISO文件吗?

template<class T>
struct A { };

/// Explicit instantiate A for int:
template struct A<int>;

/// Alias
template<class T>
using B = A<T>;

/// Explicitly instantiate A for double via alias B:
template struct B<double>;
/// error: elaborated type refers to a non-tag type
Run Code Online (Sandbox Code Playgroud)

不应该实例化,A<double>因为B<T>它只是一个不同的名称A<T>

asc*_*ler 11

这是间接禁止的,因为:

7/3者禁用写明确的专业化无类的关键字(class,struct,或union):

在一个简单声明中,只有在声明一个类(第9节)或枚举(7.2)时,也就是说,当decl-specifier-seq包含一个类说明符时,可以省略可选的init-declarator-list,详细说明-type-specifier,带有类键(9.1)或枚举说明符.

7.1.6.3/2禁止将类密钥与别名模板特化相结合:

3.4.4描述了如何在详细类型说明中对标识符进行名称查找....如果标识符解析为typedef-namesimple-template-id解析为别名模板特化,则elaborated-type-specifier格式不正确.