基本上是上面的问题。像i_stream这样的类和std命名空间中包含的其他内容一样吗? istream对象是否位于类istream的INSIDE中?如果没有任何命名冲突发生,为什么还有命名空间?
答案 0 :(得分:2)
关于标题中的问题,
“c ++标准库中的每个类,对象和函数都是在namespace std?
下声明的
没有
例如,全局operator new
分配函数仅在全局命名空间中。
答案 1 :(得分:1)
几乎。
这就是我的C ++ 11标准草案所说的[17.6.1.1,内容]:
除宏,operator new和operator delete之外的所有库实体 在嵌套在其中的命名空间std或命名空间内定义 namespace std。
所以operator new
和operator delete
被排除在外,即使它们是函数。
那里有一个脚注,说:
C标准库标题[...]也定义了其中的名称 全局命名空间,而C库设施的C ++标头 [...]也可以在全局命名空间中定义名称。
这意味着您仍然拥有<string.h>
和<stddef.h>
之类的所有old (now deprecated) C headers。那些标题将函数放在全局名称空间中,例如printf
,strcpy
或strlen
,仅举几例。
如果您使用这些标头的C ++等效项,即<cstring>
,<cstddef>
等,那么您可以在std
命名空间中获取这些函数,因此它们变为{{1} },std::printf
,std::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
}