为什么遗留C标识符不需要命名空间std?

keb*_*ebs 7 c++

这段代码是正确的C++:

#include <ctime>
int main()
{
   std::time_t t = std::time(nullptr);
}
Run Code Online (Sandbox Code Playgroud)

但是,这也编译得很好(GCC 5.2):

#include <ctime>
int main()
{
   time_t t = time(nullptr);
}
Run Code Online (Sandbox Code Playgroud)

更一般地说,传统的"C"数据类型和函数似乎不需要命名空间限定.

在我看来,这是一种危险的行为,因为两者都被接受,名称冲突的可能性仍然存在.我想(错误地?)标准名称空间std是为了保护我免受此攻击.

所以我的问题是:为什么标准化委员会在C++ 11中允许这样的行为?我的分析错了吗?

我理解遗留代码的问题,但我虽然".h"头文件(iostream.h,...)专门用于解决这一点.

编辑:链接的问题不是重复的,它询问是否应该使用std::旧版功能的版本.我想知道的是这种行为背后的基本原理.

jua*_*nza 3

从 C++11 开始,正式允许实现将标头中定义的 C 标准库名称放入<cxxx>全局命名空间中。这并不意味着它们需要这样做,因此您的第二个代码示例可能会在不同的平台上失败。

因此,说stdC 标识符不需要这一点并不完全正确。在某些实现上可能不需要它,仅此而已。

请注意,在 C++11 之前,许多实现无论如何都会这样做,尽管从技术上讲它们不应该这样做。

  • 没有真正回答问题,只是重申了所问的内容。问题是“为什么”它被允许,理由是什么。 (2认同)