C++模板专用化中的声明范围



对于以下代码:

namespace A
{
struct B
{
using type = std::tuple<struct C>;
};
}
int main()
{
C* ptr = nullptr;
B::C* ptr2 = nullptr;
A::B::C* ptr3 = nullptr;
A::C* ptr4 = nullptr;
}

我只想知道C的范围是什么.我尝试过 gcc 6.5/7.4/8.3/9.1 和 clang 6/7/8,他们都告诉我A::C是正确的。但我不确定C++标准中是否有任何材料描述了上述情况下C的范围。

您能告诉我您是否知道C++标准中与此主题相关的材料吗?非常感谢 !

这在以下各节的C++标准中有详细说明:

[basic.lookup.elab]

2 如果详细类型说明符是由类键引入的 并且此查找找不到以前声明的类型名称,或者如果 详细类型说明符出现在声明中,形式为:

类键属性说明符-seqoptidentifier ;

详细类型说明符是一个声明,它引入了 类名如 [basic.scope.pdecl] 中所述。

[basic.scope.pdecl](强调我的(

7 首先在 详细类型说明符如下:

  • [...]
  • 。如果在函数的 decl-specifier-seq 或参数声明子句中使用了详细类型说明符 在命名空间范围内定义,标识符声明为类名 在包含声明的命名空间中;否则,除非 友元声明,标识符以最小的值声明 包含声明的命名空间或块范围。

模板的参数列表位于"否则"子句中。A是包含声明的最小命名空间,因此类类型C在其内部声明。A::C是引用它的正确方式。

最新更新