在库代码中使用 ::std而不是std::,是否符合惯用法,或者说是否更合理?

编程语言 2026-07-09

假设我正在编写或维护一个C++库。该库的代码全部在某个命名空间中可用,比如 namespace mylib。另外,库中的部分代码也会使用标准库构造。

在应用程序代码中,我会使用 std::whatever 来引用这样的构造,而不是 ::std::whatever,也就是说我不会使用表示全局作用域的双冒号前缀——因为编译器不会去其他地方查找 std::(除非我愿意让它这么做)。基本上每个人都是这样做的,包括这里在SO的代码示例中。

但我的库代码呢?如果我使用一个 ::std 前缀,那就意味着……

  • 命名空间查找会更快一点
  • 这个库将对某些(诚然极不可能)出现的情况免疫:有人在 mylib::std 命名空间中添加代码。

……但这样的用法也有一些缺点:

  • 需要输入更多文字,代码不那么简洁
  • 需要对其使用保持自律,否则也就没必要

那么,::std 是否被认为是惯用法?是一个合理的选择吗?还是说——只是浪费按键?

说实话,我的动机是,极不可能的情况确实发生在我使用的 cuda 命名空间上,那个命名空间在NVIDIA开始占用它之前就一直在用;后来他们决定把他们版本的标准库放在 cuda::std::。现在我已经切换到不同的命名空间以避免与他们冲突,我在考虑是否在我的 std 引用前保留 :: 前缀。

解决方案

tl;dr: 不要使用 ::std

我见过的大多数C++库在内部都不带前缀就使用 std::。若以Boost这一(知名的)例子为参照,我们会注意到:

$ grep -r "std::" /usr/include/boost/ | wc -l
92088
$ grep -r "::std::" /usr/include/boost/ | wc -l
1046
$ grep -rl "std::" /usr/include/boost/ | cut -d/ -f5   | sort -u | wc -l
182
$ grep -rl "::std::" /usr/include/boost/ | cut -d/ -f5   | sort -u | wc -l
36

因此,确实有在 ::std 的使用,但在五个Boost库中大概只有一个会这样用,即使在那里使用也很有限。如果对大多数Boost用户来说使用 std:: 已经足够,那对于你的库来说也足够了。你也可以把这条建议理解为 "vox populi, vox dei"

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章