C++11 朋友别名模板不使用clang编译

C++11 朋友别名模板不使用clang编译,c++11,gcc,friend,clang++,partial-specialization,C++11,Gcc,Friend,Clang++,Partial Specialization,下面的代码在GCC上编译时不会发出警告,并在clang(clang和GCC的任何c++11兼容版本)上发出错误。 哪一个编译器在标准方面是正确的? 具体来说,是否允许将非部分专用化的模板别名声明为友元,该别名是类的部分模板专用化 这让我觉得这可能是不允许的: cppreference说:“朋友声明不能引用部分专门化”[…] 并且:“类型别名声明引入了一个名称,该名称可用作type-id表示的类型的同义词。它不引入新类型。[…] 最后:“函数模板和类模板声明都可能出现在友元说明符[…]中。”。它隐

下面的代码在GCC上编译时不会发出警告,并在clang(clang和GCC的任何c++11兼容版本)上发出错误。 哪一个编译器在标准方面是正确的? 具体来说,是否允许将非部分专用化的模板别名声明为友元,该别名是类的部分模板专用化

这让我觉得这可能是不允许的:

  • cppreference说:“朋友声明不能引用部分专门化”[…]
  • 并且:“类型别名声明引入了一个名称,该名称可用作type-id表示的类型的同义词。它不引入新类型。[…]
  • 最后:“函数模板和类模板声明都可能出现在友元说明符[…]中。”。它隐式地排除了模板别名作为实际模板别名而不是别名类模板作为类的朋友的可能性,这是下面代码段中的一个部分专门化
  • 然而,这让我觉得这可能是允许的:

  • cppreference说:“别名模板是一个模板”[…]。我不理解模板别名是不同的模板。因此,在没有部分指定类模板别名的情况下,将其声明为友元(如以下示例所示)是有效的。。。或者不是
  • (不是从我这里)也给出了一个解决方法,让我认为没有明显的理由使下面的代码格式错误
  • 询问了一个非常类似的问题,但没有提供关于中间模板别名的具体用法的明确答案

    模板类B{};
    模板类别A{
    //模板友元类别B;按预期失败
    使用别名=B的模板;
    模板好友类别名;
    };
    
    意图:使用中间别名将部分专门化声明为好友的合法方法(变通方法)

    结果:GCC对此感到满意,并产生了预期的行为。Clang会产生以下错误:

    <source>:7:35: error: redefinition of 'alias' as different kind of symbol
    
    template<typename N> friend class alias;
                                      ^
    <source>:6:22: note: previous definition is here
    
    template<typename N> using alias = B<T,N>;
    
    :7:35:错误:将“别名”重新定义为不同类型的符号
    模板好友类别名;
    ^
    :6:22:注:此处为之前的定义
    使用别名=B的模板;
    
    Related:@chtz:那么这似乎是链接帖子的副本?这是不可能的?编辑我的问题,给出一些额外的想法,并澄清问题。