C++使用命名空间语句

sof*_*ire 6 c++ namespaces

namespace MyNamespace
{
    static void foo1()
    {

    }
}

using namespace MyNamespace;

class MyClass
{
    void foo2()
    {
        ::foo1();
    }    
};
Run Code Online (Sandbox Code Playgroud)

范围解析操作::意味着在全局命名空间中使用方法.我们可以在这里使用::foo1().这意味着方法foo1()在全局命名空间中,对吗?

我的问题是,是否using namespace ANAMESPACE_NAME意味着我们将命名空间中的所有元素导入ANAMESPACE_NAME全局命名空间?

ytj*_*ytj 5

不,"使用命名空间ANAMESPACE_NAME"意味着我们将所有元素导入当前范围.

你可以写这样的东西:

namespace A {
    int i = 10, j = 20;
}

int f()
{
    using namespace A;  // injects names from A into the global scope.
    return i * j;       // uses i and j from namespace A.
}

int k = i * j; // Error: undefined variant i and j.
Run Code Online (Sandbox Code Playgroud)


Bjö*_*lex 3

C++2003标准的3.4.3.4节有答案:

以一元作用域运算符 :: (5.1) 为前缀的名称在全局作用域中的使用它的翻译单元中查找。该名称应在全局名称空间范围内声明,或者应是由于使用指令 (3.4.3.2)而在全局范围内声明可见的名称。

此段落在 C++11 FDIS 中几乎相同,因此这可能也适用于 C++11。