在我看来,使用未锚定的命名空间只会在以后有人添加一个与根级别命名空间同名的新命名空间时自找麻烦,并神秘地改变了一大堆程序的含义。那么,为什么人们总是说std::而不是::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作为一个道具来说明它,尽管我承认它是一个相当令人震惊的道具。
发布于 2009-11-02 23:44:02
使用非锚定名称空间的实际原因是,一个级别的名称空间通常就足够了。如果不是这样,第二个级别通常将用于实现细节。最后,即使使用多个级别,它们通常仍然是从根级别隐式指定的。即。即使在名称空间ns1中,您通常也会引用ns1::ns2::foo而不是ns2::foo或::ns1::ns2::foo。
因此,由于这三个原因,::ns1表单在正常情况下是多余的。我唯一会考虑的情况是提交Boost,因为作为一个Boost作者,我不知道我的软件将在哪里使用。
发布于 2009-11-02 23:38:28
那么,为什么人们总是说std::而不是::std::
可能是因为他们从来没有因此而遇到歧义的问题。
同样的:我从来没有在我的地址中包括“地球”,我也不会这样做。
您必须在某个地方划清界限,这是一个合理的假设,即其他人不会创建自己的std名称空间,或者至少有一个库不会很受欢迎。:)
发布于 2009-11-02 23:30:40
为什么人们总是说
::
不总是这样。我使用string和using ::std::string。因为我仍然使用std::string,所以如果有fred::std::string也没什么坏处。在小的cpp文件中,它甚至可以是using namespace ::std。示例:
#include <iostream>
using ::std::string;
//using namespace ::std; // good for small cpp-files
int main()
{
string s = "sometext"; // no leading ::std
}您永远不应该命名命名空间std
是的,您不应该为自定义名称空间提供名称std。
https://stackoverflow.com/questions/1661912
复制相似问题