为什么不能直接定义匿名struct / class-es的模板别名?

Ani*_*kar 6 c++ templates using-directives language-lawyer c++11

我可以创建以下内容:

using Foo = struct { /*Implementation*/ };

template<class>
using Bar = Foo;
Run Code Online (Sandbox Code Playgroud)

但是,以下内容是不允许的:

template<class>
using Bar = struct { /*Implementation*/ };
Run Code Online (Sandbox Code Playgroud)

来自Clang的错误比GCC更有用,并指出:

错误:无法在类型别名模板中定义“(在file:line:column处的匿名结构)”


为何不允许使用第二个代码示例?

注意:

  • 请说明第二个代码示例(如果允许)可能导致语言问题的所有示例。

  • 该标准的任何引用也有帮助。

dfr*_*fri 7

[dcl.typedef] / 2禁止在作为模板别名一部分的别名声明中定义类或枚举:

一个typedef的名称 ,也可以通过引入的 别名声明

...

定义类型说明符-SEQ 的的 定义式-ID ,如果不定义一个类或枚举 别名声明申报一个的 模板声明

后者在FCD N3092的一部分中被接受,因为CWG第1159期被接受。

相关的N3092评论US 74的评论和建议的解决方案确实提供了有关为何引入此限制的一些理由[ 强调我的]:

评论(ID)美国74

评论

别名声明允许在其类型ID(7.1.6p3)中定义类或枚举类型。但是,当别名声明是模板别名的一部分时,尚不清楚是否需要这样做:

template<typename T> using A =
struct { void f(T) { } };
Run Code Online (Sandbox Code Playgroud)

拟议的决议

要么禁止在模板别名中定义类和枚举,要么禁止在此类定义中使用模板参数,或者添加示例说明这种用法

所有者与问题

CWG 1159

性格

公认

现在,在模板别名中禁止定义类或枚举。

似乎没有人抗议(足够有说服力)禁止在模板别名中定义类和枚举,这意味着可能没有人能够给出令人信服的示例来说明这在什么地方有用。