qualified :: toplevel_namespace和非限定的toplevel_namespace之间有什么区别吗?

时间:2014-08-06 20:21:57

标签: c++ namespaces scope-resolution global-namespace

通常,::any_nameany_name should be clear之间存在差异。如果前面有::,则名称始终只在全局名称空间中查找。

我想知道是否存在技术(*)差异,给定名称空间,我已经知道 toplevel (即直接在全局命名空间下面)和我知道没有同名的第二个(嵌套)命名空间(或任何名称)

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


(*)可读性,风格和维护问题放在一边。

1 个答案:

答案 0 :(得分:3)

  

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

想想这种奇怪的情况

LegacyString.hpp

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

#include <string>
#include "LegacyString.hpp"

using namespace Legacy;

在这种情况下,如果您在以下代码中说::std::stringstd::string,肯定会有所不同。

是的,正如您other question's accepted answer中所述,命名任何构造都是完全合法的,无论是namespaceclassstruct,{ {1}}等 typedef


至于您的问题编辑:

  

&#34;我知道没有同名的第二个(嵌套)命名空间(或任何名称)。&#34;

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

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

  

&#34;两件事是无限的:宇宙和人类的愚蠢;而且我对宇宙不确定。&#34;