English 中文(简体)
为什么每个人都使用未经定名的空间申报(即:不是:)?
原标题:Why does everybody use unanchored namespace declarations (i.e. std:: not ::std::)?
  • 时间:2009-11-02 15:23:08
  •  标签:

在我看来,使用未经审判的名称空间,只是有人在新名称空间中提出麻烦,而这种新名称的名声与原名空间相同,而且神秘地改变了许多方案的含义。 因此,为什么人们总是说:而不是:std:。 它们是否真的意味着要说“我想要使用任何<条码>的<>条/条码>是手法,而不是根基吗?

我指的是:

In fred/Foo.h:

#include <string>

namespace fred {

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

} // end namespace fred

In fred/Barh:

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

In oops.cpp:

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

这些人想要的是什么,还是我失踪了吗?

也许你会说,你绝不应命名一个名称空间std。 而这种说法既好又好,但那时候,某些其他根基层的空间是什么? 任何人在任何地方是否都界定了哪一个底层名称?

为了澄清问题,我没有考虑告诉我的任何答案:std<>/code>是特殊的,因为我只是把它当作一个例子。 我谈论一个一般性问题,而Im则使用std作为说明这一问题的一种推进剂,尽管我确实承认这是一个相当开端的推进剂。

最佳回答

单设名称空间的实际原因是,通常只有一层名称空间。 如果是吨位,通常将使用第二位用于执行细节。 最后,即使在使用多个层次时,这些等级通常仍隐含在根基层面。 例如,即使是在名称空间ns1上,你通常是指ns:ns2:foo,而不是ns2:foo:ns1::ns2:foo

因此,出于这三个原因,<代码>:ns1 在正常情况下,形式是多余的。 我所认为的唯一情况是向波斯特提交材料,因为作为“蓝.”作者,我获得了我软件使用地点的知识。

问题回答

So, why do people always say std:: instead of ::std::

或许是因为他们从未真正存在含糊不清的问题。

同样: 我从来没有把“耳光”列入我的地址,我不会去。

你们必须走下一段路,这是合理的假设,即其他人打上了自己的名字空间,或者至少一个赢得的图书馆非常受欢迎。

为什么人们总是说:

并非总是如此。 I use string and using *std:string. 如将<代码>改为:std:string,因为我仍在使用std:string。 在小型芯片中,甚至可以有<代码>使用名称空间:std。 样本:

#include <iostream>
using ::std::string;
//using namespace ::std; // good for small cpp-files

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

你们绝不应该称呼一个名字空洞。

是的,你没有给习惯名称空间一个名称<代码>std。

奥凯说,<代码>std只是一个例子。 但对于我来说,你的问题只适用于有些人认为邪恶是压倒一切的<条码>。

让我举另一个例子:

namespace logging
{
    // Logs to local file
}

namespace server
{
    namespace logging
    {
        // Logs to remote destination
    }
}

namespace client
{
    namespace logging
    {
        // Logs to local file and to screen
    }
}

在此情况下,不预先排列<代码>:导致违约行为。

这非常人为:

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

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

} // namespace std
} // namespace fred

这位Fred无法解释为什么他向整个团队这样做。

回答你的问题:人们首先“:”因为这是一种习惯,节省时间,因为人们更容易预计,在任何地方使用名称空间时,这种名称是绝对的,而不是相对的。

<代码>std 我不会假定任何其他名称相同的名称空间、相同的类别,但含义不同。

在其他情况下,主要<代码>: 只是看上去,使阅读法更加困难(我认为)。 命名空间冲突太少,难以将<代码>:放在一切前。

全球名称空间撰写了许多法典。 如果有人真的重新定义:它就赢得了你如何以这种法典提及这一问题。

而且,你的设想既不可能也容易围绕工作。 首先,由于存在障碍,公约是你不使用这一名称。 第二,如果你们要面对一个界定 st名空间的一揽子计划,那么你就是这样做的:

#include <package_name.hpp>

namespace package_name {
  using namespace std;
}

namespace my_app {
  class my_class : public package_name::class_of_something {};
}

类似情况。 你们也许必须明确称呼 ::。 我的意思是:人们开始使用未争辩的 st子:由于即使是最恶劣的后果也无所作为,而且不可能这样做。

保留在<代码>_前的名称的相同方式是:std: as well as reservations.





相关问题
热门标签