使用:: in C++限定的命名空间

Leo*_*nid 8 c++ namespaces

如果C++中的命名空间符合条件,这意味着什么::?例如::testing::Test.

Pet*_*man 20

::是范围解析运算符.它总是意味着"在全局命名空间中搜索右边的符号".例如:

namespace testing {
    int a = 1;
}

namespace foo {
    namespace testing {
        int a = 2;
    }

    int b = ::testing::a; // b has the value 1
    int c = testing::a; // c has the value 2
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ing 5

这意味着testing所引用的命名空间是全局命名空间之外的命名空间,而不是另一个命名的嵌套命名空间testing.

考虑以下极端情况,可能是糟糕设计的一个例子:

namespace foo
{
    struct gizmo{int n_;};
    namespace bar
    {
        namespace foo
        {
            float f_;
        };
    };

};

int main()
{
    using namespace foo::bar;

    ::foo::gizmo g;
    g.n_;
}
Run Code Online (Sandbox Code Playgroud)

有两个命名空间foo.一个是"全局"命名空间的顶层挂起,另一个嵌套在其中foo::bar.然后我们继续using namespace foo::bar,意味着任何不合格的参考gizmo将会拿起那个foo::bar::foo.如果我们真的想要那个,foo我们可以使用明确的资格来做到这一点:

::foo::gizmo