首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么每个人都使用未锚定的名称空间声明(即std::not ::std::)?

为什么每个人都使用未锚定的名称空间声明(即std::not ::std::)?
EN

Stack Overflow用户
提问于 2009-11-02 23:23:08
回答 8查看 4.6K关注 0票数 29

在我看来,使用未锚定的命名空间只会在以后有人添加一个与根级别命名空间同名的新命名空间时自找麻烦,并神秘地改变了一大堆程序的含义。那么,为什么人们总是说std::而不是::std::呢?他们真的想说“我想使用任何方便的std,而不是根std”吗?

下面是我的意思的一个例子:

在fred/Foo.h中:

代码语言:javascript
复制
#include <string>

namespace fred {

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

} // end namespace fred

在fred/bar.h中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h"  // Oops, the meaning of Foo is now different.

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

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

为了澄清,我不会考虑任何告诉我std是特别的答案,因为我只是把它作为一个例子。我在谈论一个一般性的问题,我使用std作为一个道具来说明它,尽管我承认它是一个相当令人震惊的道具。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-11-02 23:44:02

使用非锚定名称空间的实际原因是,一个级别的名称空间通常就足够了。如果不是这样,第二个级别通常将用于实现细节。最后,即使使用多个级别,它们通常仍然是从根级别隐式指定的。即。即使在名称空间ns1中,您通常也会引用ns1::ns2::foo而不是ns2::foo::ns1::ns2::foo

因此,由于这三个原因,::ns1表单在正常情况下是多余的。我唯一会考虑的情况是提交Boost,因为作为一个Boost作者,我不知道我的软件将在哪里使用。

票数 20
EN

Stack Overflow用户

发布于 2009-11-02 23:38:28

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

可能是因为他们从来没有因此而遇到歧义的问题。

同样的:我从来没有在我的地址中包括“地球”,我也不会这样做。

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

票数 37
EN

Stack Overflow用户

发布于 2009-11-02 23:30:40

为什么人们总是说

::

不总是这样。我使用stringusing ::std::string。因为我仍然使用std::string,所以如果有fred::std::string也没什么坏处。在小的cpp文件中,它甚至可以是using namespace ::std。示例:

代码语言:javascript
复制
#include <iostream>
using ::std::string;
//using namespace ::std; // good for small cpp-files

int main()
{
  string s = "sometext"; // no leading ::std
}

您永远不应该命名命名空间std

是的,您不应该为自定义名称空间提供名称std

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1661912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档