Declaring friend template class template in C++1z produces error: specialization of ‘template<class T> class A’ must appear at namespace

Declaring friend template class template in C++1z produces error: specialization of ‘template<class T> class A’ must appear at namespace

我正在使用 boost asio 协程,我想使用新的文件系统 TS (-stdc++fs),所以我升级到 GCC 6-20151025 快照。它运作良好。但是后来我打开了 -std=c++1z,我在 boost 的源代码中遇到了一个错误。我隔离了错误,这是一个最小的例子:

// { dg-do compile }
// { dg-options "-std=c++1z" }

template< typename T >
class A
{
};

template<>
class A< void >
{
        template< typename X >
        friend class A;
};

使用 -std=c++14 可以很好地编译,但对于 -std=c++1z 会生成以下错误:

error: specialization of ‘template<class T> class A’ must appear at namespace scope
  friend class A;
               ^

我追踪了源代码中的错误,pt.c 中新引入的函数“maybe_new_partial_specialization”的行为似乎有所不同。特别是在 Concepts TS 为 active.

时才激活的情况下

我想先检查一下这是否是 Concepts TS/C++1z 中的预期行为,然后再将其报告为错误。

谢谢。

编辑:根据下面的答案,结果证明这是一个错误,因此我已经报告了它 here

向后兼容性问题在概念文件的附件 A 中进行了总结。它只包含一个条目:

您遇到的行为不是故意的,是倒退,请举报。