何时在C++中使用"::"作为全局范围?

It'*_*ete 15 c++ scope namespaces

每隔一段时间,我偶然发现一些代码,我正在考虑我的代码风格.今天是那种日子之一...

我知道你为什么要使用范围运算符来定义全局范围.实际上,这里没有范围的范围解析运算符是一个很好的链接告诉你为什么.

但是,我看到了一些让我今天想到的东西.所有有问题的类都包含在项目的命名空间中(好!),但我确实看到了全局范围运算符的大量使用.也就是说,它被用于C库中的所有东西(除了uint8_t等之外......是的,程序员使用了这个库的.h版本,因为他们运行的g ++版本显然仍然对新的C++发出警告标准).这有用吗?我认为这就像浪费字符一样(让我想起使用这个指针......除了复制构造函数和赋值运算符的情况,它有助于澄清哪个对象是哪个).我错过了什么吗?当然,有人可以到处找到usleep()或stderr(我看到"::"的最多用法)的名字,但是赢得了' 他们知道这样做可能会破坏一些可怕的东西吗?你在什么时候用范围操作符说"搞砸",只是告诉自己,在命名空间中以某种方式命名函数的人会遇到麻烦?

所以我的问题是......在这种情况下使用全局范围运算符的"正确"(主观我理解)方式是什么?如果未包含在std或您自己的命名空间中的所有内容都明确定义了全局范围吗?我倾向于小心谨慎并使用"std ::"来避免使用指令,但是在这里使用全局范围运算符可以获得什么?我倾向于认为为了清晰起见,它确实导致我们没有从当前命名空间获得有问题的变量或函数,但我在包含它而不是今天的开发之间徘徊.

一如既往,感谢您的帮助和指导,因为我希望使我的代码更清晰,更易读,并且(当然)更加出色.

Lig*_*ica 10

我很少使用它; 只有当一些歧义需要因任何原因解决时.不过,这是非常主观的.

可能在某些情况下(例如,在模板内部)您担心ADL仅在某些情况下导致歧义:

template <typename T>
void foo(T t)
{
   ::bar(t);  // :: just in case there's a `bar` in `T`'s namespace
}
Run Code Online (Sandbox Code Playgroud)