7

上面class.pre有一个示例类定义:

namespace N {
  template<class>
  struct A {
    struct B;
  };
}
using N::A;
template<class T> struct A<T>::B {};    // OK
template<> struct A<void> {};           // OK

标准规定

如果类头名称包含嵌套名称说明符,则该类说明符不应位于类范围内。

文本和示例似乎不同。

包含嵌套名称说明符(但仅“依赖” using )的A<void>模板的特化是否仍然符合要求?

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

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

编辑:该示例似乎已经更改过一次(作为较小的编辑更改):https ://github.com/cplusplus/draft/commit/b6e0848db7a72560a7bfc84f16bd23abf6aab2d6 ([class.pre] 修复示例中的错误注释)

介绍原始措辞和示例评论的论文是http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1787r6.html(P1787R6:声明和在哪里找到它们)

纸上的那行是

template<> struct A<void> {};         // error: A not nominable in ::
4

0 回答 0