我可以创建以下内容:

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

template<class>
using Bar = Foo;

但是,以下内容是不允许的:
template<class>
using Bar = struct { /*Implementation*/ };

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



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

注意:
  • 请说明第二个代码示例(如果允许)可能导致语言问题的所有示例。
  • 来自标准的任何引用也是有帮助的。
  • 最佳答案

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



    后者在CWG issue 1159被接受时作为FCD N3092的一部分被引入。

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



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

    09-06 04:31