为什么每个人都使用非锚定的命名空间声明(即 std:: 而不是 ::std::)?

2024-05-20

在我看来,使用未锚定的命名空间只是在以后当有人放入一个恰好与根级命名空间同名的新命名空间并神秘地改变了很多程序的含义时自找麻烦。那么,为什么人们总是说std::代替::std::。他们真的想说“我想用任何东西吗?”std很方便,而不是根。”?

这是我的意思的一个例子:

在 Fred/Foo.h 中:

#include <string>

namespace fred {

class Foo {
 public:
   void aPublicMember(const std::string &s);
};

} // end namespace fred

在 Fred/Bar.h 中:

namespace fred {
namespace std {  // A standard fred component

class string { // Something rather unlike the ::std::string
   // ...
};

} // namespace std

class Bar {
 public:
   void aPublicMember(std::string &s);
};

} // namespace fred

在oops.cpp中:

#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h"  // Oops, the meaning of Foo is now different.

这是人们想要的,还是我错过了什么?

也许你会说你不应该命名命名空间std。这一切都很好,但是其他一些根级命名空间呢?任何人在任何地方定义的任何根级命名空间都应该始终成为子命名空间名称的禁区吗?

澄清一下,我不会考虑任何告诉我的答案std很特别,因为我只是用它作为例子。我正在谈论一个普遍问题,并且我正在使用std作为一个道具来说明它,尽管我承认这是一个相当惊人的道具。


那么,为什么人们总是说 std:: 而不是 ::std::

可能是因为他们从来没有真正遇到过歧义问题。

同样的道理:我从来不需要在我的地址中包含“地球”,而且我也不会这样做。

你必须在某个地方划清界限,这是一个合理的假设,其他人不会创建自己的 std 命名空间,或者至少这样做的库不会很受欢迎。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么每个人都使用非锚定的命名空间声明(即 std:: 而不是 ::std::)? 的相关文章

随机推荐