使用 ::namespace::something 比 namespace::something 有什么好处

What is the benefit of using ::namespace::something over namespace::something?

本文关键字:something namespace 什么 使用      更新时间:2023-10-16

我的新工作场所的代码在开始时使用看似冗余的范围解析访问命名空间。例如,::std::vector<int>而不是std::vector<int>[1] 我以前从未见过以这种方式进行命名空间访问。

我能想到的一个有点人为的场景是,当某个命名空间ns声明一个嵌套命名空间std时,它也有一个vector(在这个例子中(。然后,左侧的"附加"::确保使用的是全局std::vector,而不是本地。但是,这不太可能是原因,因为我们的代码经过了一个相当复杂的审查过程,使得任何人都几乎不可能引入新的std命名空间。

还有其他情况可以有所作为吗?


[1]我请了团队中的一些高级开发人员向我解释这一点,但他们只有一个模糊的概念,为什么要使用这个"约定"。最早编写代码的开发人员几年前就离开了团队,在他们离开之前没有人问过他们。

我能想象到的最值得注意的场景是使用 std::tolower 并迭代容器时:

#include <cctype>
#include <algorithm>
std::string str = "Masked Man";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);

正如@MatthieuM.在此答案中所解释的那样,这是<locale><cctype> tolower函数之间的名称冲突。由于在您的实现(实际上是未指定的(上,C++标准库中永久存在的 C 标准库函数位于 std 全局命名空间中,因此::tolower显式使用 <cctype> 中的函数。

因此,显式访问C++标准库的 C 标准库部分算作另一个原因,IMO。