qualified::toplevel_namespace和unqualified toplevel_namespace

Is there any difference between qualified ::toplevel_namespace and unqualified toplevel_namespace?

本文关键字:namespace toplevel unqualified qualified      更新时间:2023-10-16

一般来说,::any_nameany_name的区别应该很明显。如果前面有::,则该名称始终只在全局命名空间中查找。

我想知道,然而,是否有一个技术(*)差异,给定一个命名空间,我已经知道是顶层(即直接低于全局命名空间),其中我知道没有第二个(嵌套的)命名空间(或任何名称)相同的名称。

例如,使用::std::stringstd::string有什么区别吗?


(*)不考虑可读性、风格和维护问题。

"例如,使用::std::string和使用std::string有什么区别吗?"

想想这种奇怪的情况

LegacyString.hpp

namespace Legacy {
    namespace std {
        class string {
            // ...
        };
    }
}

#include <string>
#include "LegacyString.hpp"
using namespace Legacy;

在这种情况下,如果你在下面的代码中说::std::string或只是std::string,肯定会有区别。

是的,正如你的另一个问题的公认答案所述,命名任何结构都是完全合法的,无论是namespace, class, struct, typedef等。 std


关于你的问题编辑:

"并且我知道没有第二个(嵌套的)名称空间(或任何名称)相同的名称。"

如果你知道这种情况,这两种形式当然是等价的。正如您所提到的,名称空间的解析最终在全局级别结束,并且在没有前缀::的情况下将正确地解析它。

IMHO通常我们依赖,至少没有人是那么愚蠢,命名任何结构std 实际上。但是引用爱因斯坦的话:

"有两样东西是无限的:宇宙和人类的愚蠢;我对宇宙也不确定。"