关于 C++ 中命名空间的极其基本的问题

Extremely basic question about namespaces in c++

using namespace X;
    cout << var;
    using Y::var;
    cout << var;

假设我有一个命名空间 X 和一个命名空间 Y,它们都包含一个名为 var 的 int 类型的变量。当我说 using namespace X; 时,我想象发生的事情是,如果我使用一些不在全局名称范围中的变量,基本上发生的是它没问题,我将在 namespace X 中寻找 var 但现在我也用Y::var 这到底是什么意思?那只是说 var 与 Y::var 相同吗?但是在那种情况下 using namespace X 发生了什么,它甚至没有在那里寻找 var 因为我说我正在使用 Y::var?

using 指令后

using namespace X;

编译器使用非限定名称查找查找以下语句中使用的名称var

cout << var;

并且由于 using 指令,它会在命名空间 X.

中找到变量 var

这个使用声明

using Y::var;

在当前作用域和下一条语句

中从命名空间Y引入变量var
cout << var;

将使用命名空间 Y 中的变量 var

这是一个演示程序。

#include <iostream>

namespace X
{
    int var = 1;
}

namespace Y
{
    int var = 2;
}

int main() 
{
    using namespace X;

    std::cout  << "var = " << var << '\n';

    using Y::var;

    std::cout  << "var = " << var << '\n';
}

程序输出为

var = 1
var = 2

也就是在函数main的块作用域中引入变量var的using声明隐藏了命名空间X中声明的变量var的声明。

事实上,下面简化的演示程序在本质上与上述程序在名称查找方面的行为类似。

#include <iostream>

int var = 1;

int main() 
{
    std::cout  << "var = " << var << '\n';

    int var = 2;

    std::cout  << "var = " << var << '\n';
}

是的,当您请求 var 时,using Y::var; 会隐藏 X::var。前者就像在此范围内声明了 Y::var,后者仅影响不合格的查找。

using ns_name::name;

using-declaration: makes the symbol name from the namespace ns_name accessible for unqualified lookup as if declared in the same class scope, block scope, or namespace as where this using-declaration appears.

Names introduced into a namespace scope by a using-declaration can be used just like any other names, including qualified lookup from other scopes

using namespace ns_name;

using-directive: From the point of view of unqualified name lookup of any name after a using-directive and until the end of the scope in which it appears, every name from ns_name is visible as if it were declared in the nearest enclosing namespace which contains both the using-directive and ns_name.