C++11 朋友别名模板不使用clang编译
下面的代码在GCC上编译时不会发出警告,并在clang(clang和GCC的任何c++11兼容版本)上发出错误。 哪一个编译器在标准方面是正确的? 具体来说,是否允许将非部分专用化的模板别名声明为友元,该别名是类的部分模板专用化 这让我觉得这可能是不允许的: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表示的类型的同义词。它不引入新类型。[…] 最后:“函数模板和类模板声明都可能出现在友元说明符[…]中。”。它隐
模板类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:那么这似乎是链接帖子的副本?这是不可能的?编辑我的问题,给出一些额外的想法,并澄清问题。