首选在std
命名空间中声明的名称。原因在 §17.6.1.3/4 ( ISO/IEC 14882:2011(E) , C++11) 中给出:
除了第 18 到 30 条和附录 D 中的说明外,每个头文件cname的内容应与相应的头文件名称.h
的内容相同,如 C 标准库 (1.2) 或 C Unicode TR 中规定的,视情况而定,如如果通过包含。但是,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)在 namespace 的命名空间范围 (3.3.6) 内std
。std
未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明(7.3.3)注入命名空间。
如果您使用不带 的<c
名称>
标题中的名称std
,则您的程序依赖于未指定的要求。
这在 C++03 和更早版本中有所不同,其中名称只应该出现在std
命名空间中。然而,现实情况是,许多实现只是将 C 标准库头文件<
名称.h>
的内容注入到std
其中,因此在 C++11 中已经适应了这一点。C++03 标准的相应部分(§17.4.1.2/4)说:
除第 18 至 27 条中的说明外,每个头cname的内容应与相应头名称.h
的内容相同,如 ISO/IEC 9899:1990 编程语言 C(第 7 条)或 ISO/IEC:1990 中规定的编程语言——C 修正案 1:C 完整性,(第 7 条),视情况而定,如同包含。但是,在 C++ 标准库中,声明和定义(在 C 中定义为宏的名称除外)在 namespace 的命名空间范围 (3.3.5) 内std
。
除此之外,限定名称std::
有助于避免冲突——如果你完全限定它,你就会确切地知道你得到了什么。如果你真的打算做using namespace std
or using std::something
,至少在尽可能小的范围内做。