是否在命名空间std下声明了c ++标准库中的每个类,对象和函数?

时间:2014-09-06 09:24:52

标签: c++ class object namespaces std

基本上是上面的问题。像i_stream这样的类和std命名空间中包含的其他内容一样吗? istream对象是否位于类istream的INSIDE中?如果没有任何命名冲突发生,为什么还有命名空间?

2 个答案:

答案 0 :(得分:2)

关于标题中的问题,

  

“c ++标准库中的每个类,对象和函数都是在namespace std?

下声明的

没有

例如,全局operator new分配函数仅在全局命名空间中。

答案 1 :(得分:1)

几乎。

这就是我的C ++ 11标准草案所说的[17.6.1.1,内容]:

  

除宏,operator new和operator delete之外的所有库实体   在嵌套在其中的命名空间std或命名空间内定义   namespace std。

所以operator newoperator delete被排除在外,即使它们是函数。

那里有一个脚注,说:

  

C标准库标题[...]也定义了其中的名称   全局命名空间,而C库设施的C ++标头   [...]也可以在全局命名空间中定义名称。

这意味着您仍然拥有<string.h><stddef.h>之类的所有old (now deprecated) C headers。那些标题将函数放在全局名称空间中,例如printfstrcpystrlen,仅举几例。

如果您使用这些标头的C ++等效项,即<cstring><cstddef>等,那么您可以在std命名空间中获取这些函数,因此它们变为{{1} },std::printfstd::strcpy等等。但是可能也会在全局命名空间中获取它们。

因此,允许编译以下内容,并且可能在您使用自己喜欢的编译器进行编译时:

std::strlen

以下情况不会:

#include <cstdio>

int main()
{
    printf("Test\n");
    std::printf("Test\n");
}

关于您的相关问题:

  

如果没有任何命名冲突发生,为什么还有命名空间呢?

运用你的想象力:

#include <stdio.h>

int main()
{
    printf("Test\n");
    std::printf("Test\n"); // error
}