【问题标题】:What is the benefit of using ::namespace::something over namespace::something?使用 ::namespace::something 而不是 namespace::something 有什么好处?
【发布时间】:2016-05-11 01:30:44
【问题描述】:

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

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

是否还有其他可能产生影响的场景?


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

【问题讨论】:

  • 我想你回答了你的问题,我看不出有任何其他理由这样做
  • @Garf365 是的,这是我能想到的一种情况,只是想看看这里的专家是否知道其他任何事情。有时这样的问题会导致学习一些完全出乎意料的东西。 :-)

标签: c++ namespaces


【解决方案1】:

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

#include <cctype>
#include <algorithm>

std::string str = "Masked Man";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);

正如@MatthieuM 的this 回答中所解释的那样,这是&lt;locale&gt;&lt;cctype&gt; 中的tolower 函数之间的名称冲突。因为,在您的实现 (it's actually unspecified) 中,C++ 标准库中永久存在的 C 标准库函数位于 std 全局命名空间中,::tolower 明确使用来自 @987654330 的函数@。

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

【讨论】:

  • 现在是正确的,但如果我必须在 std::tolower::tolower 之间消除歧义,我确实会使用 &lt;ctype.h&gt;(即使不推荐使用 .h C 标准头文件)。跨度>
  • 这并不能解释为什么有人会在::std::tolower 中使用:: 前缀。
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多