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

时间:2014-11-10 18:49:10

标签: 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;
}

1 个答案:

答案 0 :(得分:3)

GCC和Clang是对的。在Foo::tester内,Bar的无限制使用明确指代Foo::Bar

不合格的查找由C ++ 11 3.4.1 / 1指定:

  

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

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

  

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

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