“使用命名空间 ::X”中的前导 :: 是什么意思?在 C++

发布于 2024-11-26 08:18:14 字数 201 浏览 2 评论 0原文

有人可以解释一下以下命名空间用法之间的区别:

using namespace ::layer::module;

using namespace layer::module;

是什么导致了额外的 ::之前?

can somebody explain me the difference between the following namespace usages:

using namespace ::layer::module;

and

using namespace layer::module;

What causes the additional :: before layer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

太阳公公是暖光 2024-12-03 08:18:14

如果在上下文中使用它,则会有所不同,例如:

namespace layer {
    namespace module {
        int x;
    }
}

namespace nest {
    namespace layer {
        namespace module {
            int x;
        }
    }
    using namespace /*::*/layer::module;
}

使用初始 :: 时,第一个 x 在 using 指令之后可见,没有它,第二个 < nest::layer::module 内的 code>x 将变得可见。

There would be a difference if it was used in a context such as:

namespace layer {
    namespace module {
        int x;
    }
}

namespace nest {
    namespace layer {
        namespace module {
            int x;
        }
    }
    using namespace /*::*/layer::module;
}

With the initial :: the first x would be visible after the using directive, without it the second x inside nest::layer::module would be made visible.

御守 2024-12-03 08:18:14

前导 :: 指的是全局命名空间。任何以 :: 开头的限定标识符将始终引用全局命名空间中的某个标识符。不同之处在于,当您在全局命名空间和某些本地命名空间中拥有相同的内容时:

namespace layer { namespace module {
    void f();
} }

namespace blah { 
  namespace layer { namespace module {
      void f();
  } }

  using namespace layer::module // note: no leading ::
                                // refers to local namespace layer
  void g() {
    f(); // calls blah::layer::module::f();
  }
}

namespace blubb {
  namespace layer { namespace module {
      void f();
  } }

  using namespace ::layer::module // note: leading ::
                                  // refers to global namespace layer
  void g() {
    f(); // calls ::layer::module::f();
  }
}

A leading :: refers to the global namespace. Any qualified identifier starting with a :: will always refer to some identifier in the global namespace. The difference is when you have the same stuff in the global as well as in some local namespace:

namespace layer { namespace module {
    void f();
} }

namespace blah { 
  namespace layer { namespace module {
      void f();
  } }

  using namespace layer::module // note: no leading ::
                                // refers to local namespace layer
  void g() {
    f(); // calls blah::layer::module::f();
  }
}

namespace blubb {
  namespace layer { namespace module {
      void f();
  } }

  using namespace ::layer::module // note: leading ::
                                  // refers to global namespace layer
  void g() {
    f(); // calls ::layer::module::f();
  }
}
ゃ懵逼小萝莉 2024-12-03 08:18:14

第二种情况可能是 X::layer::module ,其中 using namespace X 已经发生。

在第一种情况下,前缀 :: 表示“编译器,别聪明,从全局命名空间开始”。

The second case might be X::layer::module where using namespace X has already happened.

In the first case the prefix :: means "compiler, don't be clever, start at the global namespace".

转身泪倾城 2024-12-03 08:18:14

它在 C++ 中称为限定名称查找

这意味着所引用的层命名空间是全局命名空间中的一个,而不是另一个名为层的嵌套命名空间。

对于Standerdese粉丝:
$3.4.3/1

“在 :: 范围解析运算符 (5.1) 应用于提名其类的嵌套名称说明符之后,可以引用类或命名空间成员的名称在查找 :: 范围解析运算符之前的名称期间,如果找到的名称不是类名称(第 9 条)或名称空间名称(7.3.1),则忽略对象、函数和枚举器名称。 ,程序是格式不正确。”

It is called as Qualified name lookup in C++.

It means that the layer namespace being referred to is the one off the global namespace, rather than another nested namespace named layer.

For Standerdese fans:
$3.4.3/1

"The name of a class or namespace member can be referred to after the :: scope resolution operator (5.1) applied to a nested-name-specifier that nominates its class or namespace. During the lookup for a name preceding the :: scope resolution operator, object, function, and enumerator names are ignored. If the name found is not a class-name (clause 9) or namespace-name (7.3.1), the program is ill-formed."

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文