一般来说,::any_name
和any_name
的区别应该很明显。如果前面有::
,则该名称始终只在全局命名空间中查找。
我想知道,然而,是否有一个技术(*)差异,给定一个命名空间,我已经知道是顶层(即直接低于全局命名空间),其中我知道没有第二个(嵌套的)命名空间(或任何名称)相同的名称。
例如,使用::std::string
和std::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
实际上。但是引用爱因斯坦的话:
"有两样东西是无限的:宇宙和人类的愚蠢;我对宇宙也不确定。"