范围parsing运算符没有范围

在C ++中,当没有作用域时,作用域parsing运算符的目的是什么? 例如:

::foo(); 

这意味着全球范围。 如果在相同范围内有相互冲突的函数或variables,并且需要使用全局函数或variables,则可能需要使用此运算符。 你可能有这样的东西:

 void bar(); // this is a global function class foo { void some_func() { ::bar(); } // this function is calling the global bar() and not the class version void bar(); // this is a class member }; 

如果您需要从类成员函数中调用全局bar()函数,则应该使用:: bar()来获取函数的全局版本。

你也应该注意到,这个名字parsing发生在超载parsing之前。 因此,如果在当前范围内有相同名称的东西,则将停止查找其他名称并尝试使用它们。

 void bar() {}; class foo { void bar(int) {}; void foobar() { bar(); } // won't compile needs ::bar() void foobar(int i) { bar(i); } // ok } 

在全局名称空间中查找以范围parsing运算符 ( :: :)开头的名称。 我们可以通过查看C ++标准草案部分来看到这一点3.4.3 合格的名称查找段落4重点是我的 ):

在全局范围内 ,使用一元作用域操作符::(5.1)作为前缀的名称在翻译单元中使用。 名称应在全局名称空间范围内声明,或者是由于使用指令(3.4.3.2)而声明在全局范围内可见的名称。 即使标识符已被隐藏 ,使用::也允许引用全局名称 (3.3.10)。

作为标准状态,这允许我们使用全局名称空间中的名称,否则这些名称将被隐藏 ,链接文档中的示例如下所示:

 int count = 0; int main(void) { int count = 0; ::count = 1; // set global count to 1 count = 2; // set local count to 2 return 0; } 

这个措辞非常类似于N1804 ,这是最早的草案标准。

在本地作用域中已经有一个名为foo()的函数,但是您需要访问全局作用域中的函数。

指的是全球范围

我的c + +是生锈的,但我相信,如果你有一个函数声明在本地范围,如foo()和一个在全球范围内,foo()指的是本地的。 :: foo()将引用全局。