在另一个命名空间内使用`namespace`的范围

rel*_*xxx 4 c++ scope using-directives

我知道我把using指令的范围限制在一个块或一个函数放在里面.然后它将仅适用于该范围.但是如果块是a,namespace它通过相同命名空间的所有块显然适用.那是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7E)

namespace N1
{
    struct Foo{};
}

namespace N2
{
    using namespace N1;
    Foo f;
}

namespace N2
{
    Foo f2;
}

int main()
{
    N2::f2;
}
Run Code Online (Sandbox Code Playgroud)

我本来应该Foo f2给出一个错误,因为Foo应该是未知的.所以我真正的问题是,using对于同一名称空间的所有块,名称空间块中的语句是否有效?

当所有cpp文件被包含在一起编译时会导致问题,因为它会污染其他cpp文件,这些文件不应该包含其他命名空间(放置using指令的那个).因此,实际上它可能会导致不良冲突.

Sin*_*all 6

标准说(7.3.4/2)

using-directive指定指定命名空间中的名称可以在using-directive出现在using-directive之后的范围内使用.

namespace A {  \
int i = 9;      | <-- namespace A scope. 
}              /

namespace B {      \
using namespace A;  | <-- namespace B scope. "i" is visible after 
void bar()          |     the "using namespace" line.
{                   |
    i += 1; /*Ok*/  |     
}                   |
}                  /

namespace B {     \
void foo()         |
{                  | <-- still namespace B scope. "i" is still visible
    i += 1; /*Ok*/ |
}                  |
}                 /
Run Code Online (Sandbox Code Playgroud)

因此,使用此指令可见的内容将using namespace B在行后的A范围内随处可见.当然,如果你在头文件中执行此操作,所有内容将在包含该头文件的任何位置都可见,因此您不应该在头文件中的任何位置使用"using namespace ...".