未命名和命名空间解析

5
一个名称既存在于未命名的命名空间中,又存在于本地命名空间中,引用该名称是否会导致二义性错误?还是解决方案已经明确定义?我在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个回答

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,并且查找结束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接