使用 using 定义命名空间中的类

Seb*_*ian 11 c++ language-lawyer c++23

[class.pre] p3状态:

如果类头名称包含嵌套名称说明符,则该类说明符不应位于类范围内。 如果其类名是标识符,则类说明符应对应于嵌套名称说明符所引用的类、类模板或命名空间中可命名的一个或多个声明;它们都应具有相同的目标范围,并且类说明符的目标范围的目标范围就是该范围。

[例子:

namespace N {
  template<class>
  struct A {
    struct B;
  };
}
using N::A;
template<class T> struct A<T>::B {};    // OK
template<> struct A<void> {};           // OK
Run Code Online (Sandbox Code Playgroud)

--结束示例]

第一句话和例子似乎有所不同。

包含嵌套名称说明符(但仅“依赖”使用A<void>)的模板的专业化是否仍然符合?

clang 和 msvc 接受它,gcc 显示错误

错误:在其命名空间之外显式特化“模板结构 N::A”必须使用嵌套名称说明符 [-fpermissive]

附加背景

介绍原始措辞和示例注释的论文是P1787R6:声明以及在哪里找到它们,包含以下行:

template<> struct A<void> {};         // error: A not nominable in ::
Run Code Online (Sandbox Code Playgroud)

编辑更改编辑:[class.pre] 修复示例中不正确的注释更改了示例,以便注释现在显示为OK与此相关的更多讨论可在社论第 4592 期中找到