未命名和命名的命名空间解析

And*_*rew 5 c++ namespaces

如果对未命名的命名空间和本地命名空间中存在的名称的引用是否会导致歧义错误或分辨率是否明确定义?我在G ++和Clang上看到以下工作正常,在MSVC上则不太好.

namespace Foo
{
    class Bar
    {
    public:
        int x;
    };
}

namespace
{
    class Bar
    {
    public:
        int y;
    };
}

namespace Foo
{

void tester()
{
    Bar b;
}

}

int main()
{
    Foo::tester();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 3

GCC 和 Clang 是对的。其中Foo::tester,无限制地使用Bar“明确”指的是Foo::Bar

\n\n

C++11 3.4.1/1 指定了非限定查找:

\n\n
\n

按照每个相应类别中列出的顺序在范围中搜索声明;一旦找到名称的声明,名称查找就会结束。

\n
\n\n

3.4.1/6 中列出了在函数中搜索名称使用的范围:

\n\n
\n

作为命名空间 N [...] 成员的函数 [...] 定义中使用的名称应在其在块 [...] 中使用之前声明,或者应在其在命名空间中使用之前声明N 或者,如果 N 是嵌套命名空间,则应在其在 N\xe2\x80\x99s 封闭命名空间之一中使用之前进行声明。

\n
\n\n

在这种情况下,该函数是 的成员Foo,因此Foo在封闭的(全局)命名空间(包括未命名的命名空间)之前进行搜索。Foo::Bar在那里找到,查找结束。

\n