§3.4.6/1:
In a using-directive or namespace-alias-definition, during the lookup for a namespace-name or for a name in a nested-name-specifier only namespace names are considered.
基本上,我要问的是:“为什么这一段是必要的?”
最佳答案
Defect report 373: Lookup on namespace qualified name in using-directive举例说明为什么措辞很重要:
namespace X {
namespace Y {
struct X {
void f()
{
using namespace X::Y;
namespace Z = X::Y;
}
};
}
}
在 using namespace X::Y
结构或命名空间中引用了哪个 X
?如果 3.4.6
中没有这样的措辞,就会产生歧义。
这实际上导致了措辞的变化:
When looking up a namespace-name in a using-directive or namespace-alias-definition, only namespace names are considered.
我们今天所拥有的,因为原始措辞没有涵盖嵌套名称说明符。
歧义在于 nested-name-specifier 如果我们查看 draft C++11 standard 5.1.1
General 部分的语法如下:
nested-name-specifier:
::opt type-name ::
::opt namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier templateopt simple-template-id ::
以及以下我不会复制的段落,因为它们很大,不会将nested-name-specifier 限制为 namespace 。
据我所知,7.3.1
命名空间定义 充分限制了 namespace-name 以防止歧义。
关于c++ - 在查找 namespace 名称期间可以考虑哪些其他名称,而不是 namespace 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058966/