使用 ::namespace::something 比 namespace::something 有什么好处
What is the benefit of using ::namespace::something over namespace::something?
我的新工作场所的代码在开始时使用看似冗余的范围解析访问命名空间。例如,::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。
相关文章:
- "using namespace std;"在C++的作用是什么?
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- C++ "using tcp=x"到"namespace tcp=x"有什么区别
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 为什么标准首选圆括号初始化为"make_<something>"?
- 以前的'namespace reference { }'声明
- "using namespace"子句在什么范围内有效?
- C++ - 尝试在类中使用全局时'Not a class or namespace'
- 如何找到"using namespace std"的违规用法?
- 声明"使用命名空间 C;"对于证明 [namespace.udir]/3 中的示例中显示的结果至关重
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 如何根据对象名称将'using namespace'添加到类定义中?
- 修复第三方代码:"error: ‘enable_if’ in namespace ‘std’ does not name a template type"
- 什么原因导致我的"‘FatalError’ in namespace ‘Foam’ does not name a type"错误?
- 什么是使用something::something:something mean(c++)
- 没有任何 #include "using namespace std;"?
- 使用 ::namespace::something 比 namespace::something 有什么好处