在查找命名空间名称的过程中,可以考虑与命名空间名称不同的其他名称
What other names could be considered during the lookup for a namespace-name, different than namespace names?
§3.4.6/1:
在using指令或命名空间别名定义中查找命名空间名称或嵌套名称说明符只考虑命名空间名称。
基本上,我要问的是:"为什么这段话是必要的?"
缺陷报告373:在using指令中查找命名空间限定名称提供了一个措辞重要的示例:
namespace X {
namespace Y {
struct X {
void f()
{
using namespace X::Y;
namespace Z = X::Y;
}
};
}
}
哪个X
在using namespace X::Y
中被引用为结构或命名空间?如果3.4.6
中没有这一措辞,它将是模棱两可的。
这实际上导致了措辞的变化:
在using指令或命名空间别名定义中查找命名空间名称时,只考虑命名空间名称。
到今天为止,因为最初的措辞没有涵盖嵌套名称说明符。
歧义在于嵌套名称说明符,如果我们查看C++11标准草案,5.1.1
常规部分中的语法如下:
nested-name-specifier:
::opt type-name ::
::opt namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::
以下段落我不会复制,因为它们很大,不会将嵌套名称说明符限制为命名空间。
据我所知,7.3.1
命名空间定义充分限制名称空间名称以防止歧义。
Clang针对namespace using
和alias directives
的单元测试正是您问题的答案:
clang cc-仅限fsyntax-验证%s
struct ns1 {}; // This is not a namespace, although a namespace has ns1 as a name
void ns2();
int ns3 = 0;
namespace ns0 {
namespace ns1 {
struct test0 {};
}
namespace ns2 {
struct test1 {};
}
namespace ns3 {
struct test2 {};
}
}
using namespace ns0;
namespace test3 = ns1; // don't get confused
namespace test4 = ns2;
namespace test5 = ns3;
using namespace ns1; // don't get confused
using namespace ns2;
using namespace ns3;
test0 a;
test1 b;
test2 c;
n3160缺陷报告中也讨论了这个问题
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- C++使用其他命名空间中的符号,而不使它们可从外部访问
- 使用其他命名空间内命名空间中的函数
- 如何访问其他 .cc 文件中命名空间中定义的函数
- 其他命名空间中的对象没有包含,否则文件相同
- 其他命名空间中的派生类
- 您可以使用没有 :: 的命名空间引用其他类中的函数吗?
- 内联类方法,用于调用其他文件的 anon 命名空间中的函数
- SFINAE:当重载移动到其他命名空间时,检查函数是否存在会中断
- 使用命名空间标准与其他替代方法
- C++:当前命名空间是否覆盖其他命名空间
- 在查找命名空间名称的过程中,可以考虑与命名空间名称不同的其他名称
- 用于c++ 11的Vim语法高亮显示不会混淆其他高亮显示.例如,类/命名空间作用域