“使用命名空间 ::X”中的前导 :: 是什么意思?在 C++
有人可以解释一下以下命名空间用法之间的区别:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果在上下文中使用它,则会有所不同,例如:
使用初始
::
时,第一个x
在 using 指令之后可见,没有它,第二个 <nest::layer::module
内的 code>x 将变得可见。There would be a difference if it was used in a context such as:
With the initial
::
the firstx
would be visible after the using directive, without it the secondx
insidenest::layer::module
would be made visible.前导
::
指的是全局命名空间。任何以::
开头的限定标识符将始终引用全局命名空间中的某个标识符。不同之处在于,当您在全局命名空间和某些本地命名空间中拥有相同的内容时: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:第二种情况可能是
X::layer::module
,其中using namespace X
已经发生。在第一种情况下,前缀
::
表示“编译器,别聪明,从全局命名空间开始”。The second case might be
X::layer::module
whereusing namespace X
has already happened.In the first case the prefix
::
means "compiler, don't be clever, start at the global namespace".它在 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."