Seb*_*ian 11 c++ language-lawyer c++23
如果类头名称包含嵌套名称说明符,则该类说明符不应位于类范围内。 如果其类名是标识符,则类说明符应对应于嵌套名称说明符所引用的类、类模板或命名空间中可命名的一个或多个声明;它们都应具有相同的目标范围,并且类说明符的目标范围的目标范围就是该范围。
[例子:
Run Code Online (Sandbox Code Playgroud)namespace N { template<class> struct A { struct B; }; } using N::A; template<class T> struct A<T>::B {}; // OK template<> struct A<void> {}; // OK--结束示例]
第一句话和例子似乎有所不同。
不包含嵌套名称说明符(但仅“依赖”使用A<void>)的模板的专业化是否仍然符合?
clang 和 msvc 接受它,gcc 显示错误
错误:在其命名空间之外显式特化“模板结构 N::A”必须使用嵌套名称说明符 [-fpermissive]
介绍原始措辞和示例注释的论文是P1787R6:声明以及在哪里找到它们,包含以下行:
Run Code Online (Sandbox Code Playgroud)template<> struct A<void> {}; // error: A not nominable in ::
编辑更改编辑:[class.pre] 修复示例中不正确的注释更改了示例,以便注释现在显示为OK。与此相关的更多讨论可在社论第 4592 期中找到