C++模板专用化中的声明范围
The scope of a declaration in C++ template specialization
对于以下代码:
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
是引用它的正确方式。
相关文章:
- 错误:未在此范围内声明'reverse'
- 在基于范围的for循环中使用结构化绑定声明
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 未在此范围内声明错误 'xy'
- Socklen_t未在此范围内声明
- 如何从未知视图中声明范围::v3::View 变量
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- "Main"已在当前范围内声明
- c++ 变量在宏的扩展中没有在这个范围内声明
- 朋友声明的复杂范围界定规则有什么意义?
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 'num1'未在此范围内声明
- 在此范围内未声明错误"Clreol"
- 如何找到在本地范围内声明的变量的地址?
- 简化在 Pybind11 中为 C++ 模板类生成包装类:模板声明不能出现在块范围内
- C++模板专用化中的声明范围
- 这是有效的C++代码吗?(在声明范围之外使用本地类型)
- 函数声明范围
- 如何在类声明范围内使用“using space::function”