【问题标题】:Extremely basic question about namespaces in c++关于 C++ 中命名空间的一个非常基本的问题
【发布时间】:2021-12-06 11:00:29
【问题描述】:
using namespace X;
    cout << var;
    using Y::var;
    cout << var;

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

【问题讨论】:

  • 只需创建一个示例并检查编译器会做什么。这是最好的学习方式。如果我们为您提供答案,您将在 5 分钟内忘记它。
  • 取决于上下文。创建一个minimal reproducible example。与其描述程序是怎样的,不如向我们展示程序。
  • 有一个程序可以回答这些类型的问题。 You can ask it
  • 我已经检查了编译器做了什么,我得到了我所期望的使用命名空间 XI 打印的 var 并且我在该命名空间中得到了 var 然后当我使用 Y::var 并打印出来时在 Y 命名空间中得到了 var 我只是想问一下以确保我之前所说的对吗?我说我使用 Y:::var 只是覆盖了使用命名空间 X 的那种?至少对于 var 抱歉,如果我没有很好地解释这一点,但是当我说我正在使用 Y::var 时,基本上是在说好的忽略我正在使用的其他命名空间,如果你在我正在谈论的代码中看到 var Y::var?
  • "我正在使用 Y:::var 类型只是覆盖使用命名空间 X 类型?" - 它只覆盖 X::varX 的其余部分仍在使用中。

标签: c++ namespaces name-lookup using-directives using-declaration


【解决方案1】:

在 using 指令之后

using namespace X;

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

cout << var;

由于 using 指令,它会在命名空间 X 中找到变量 var

this using 声明

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';
}

【讨论】:

    【解决方案2】:

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

    using ns_name::name;

    using-declaration:使来自命名空间ns_name 的符号name 可访问以进行非限定查找,就好像在与此using-declaration相同的类范围、块范围或命名空间中声明出现。

    通过 using-declaration 引入命名空间范围的名称可以像任何其他名称一样使用,包括从其他范围进行限定查找

    using namespace ns_name;

    using-directive:从使用指令之后的任何名称的非限定名称查找的角度来看,直到它出现的范围结束,来自ns_name 的每个名称都是可见的,就好像它在包含 using-directivens_name 的最近的封闭命名空间。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多