1

::any_name通常,和之间的区别any_name 应该很清楚。如果以::名称开头,则始终且仅在全局命名空间中查找。

然而,我想知道是否存在技术(*)差异,给定一个我已经知道是顶级的命名空间(即直接在全局命名空间之下)并且我知道没有第二个(嵌套)命名空间(或任何名称)同名。

例如, using ::std::stringvs.之间有什么区别std::string吗?


(*) 除了可读性、风格和维护问题。

4

1 回答 1

3

“例如,使用 ::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,typedefstd


至于您的问题编辑:

“而且我知道没有第二个(嵌套的)命名空间(或任何名称)同名。”

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

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

“有两件事是无限的:宇宙和人类的愚蠢;我不确定宇宙。”

于 2014-08-06T20:29:39.977 回答