::any_name
通常,和之间的区别any_name
应该很清楚。如果以::
名称开头,则始终且仅在全局命名空间中查找。
然而,我想知道是否存在技术(*)差异,给定一个我已经知道是顶级的命名空间(即直接在全局命名空间之下)并且我知道没有第二个(嵌套)命名空间(或任何名称)同名。
例如, using ::std::string
vs.之间有什么区别std::string
吗?
(*) 除了可读性、风格和维护问题。
::any_name
通常,和之间的区别any_name
应该很清楚。如果以::
名称开头,则始终且仅在全局命名空间中查找。
然而,我想知道是否存在技术(*)差异,给定一个我已经知道是顶级的命名空间(即直接在全局命名空间之下)并且我知道没有第二个(嵌套)命名空间(或任何名称)同名。
例如, using ::std::string
vs.之间有什么区别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
。
至于您的问题编辑:
“而且我知道没有第二个(嵌套的)命名空间(或任何名称)同名。”
如果您知道是这种情况,那么这两种形式当然是等价的。正如您所提到的,命名空间的解析最终在全局级别进行,并且将在没有前缀的情况下正确解析它::
。
恕我直言,我们通常依赖,至少没有人那么愚蠢,实际上命名任何构造。std
但是引用爱因斯坦的话:
“有两件事是无限的:宇宙和人类的愚蠢;我不确定宇宙。”