在C ++中,不带范围使用范围解析运算符的目的是什么? 例如:
::foo();
这意味着全球范围。 如果在同一作用域中有冲突的函数或变量,并且需要使用全局运算符,则可能需要使用此运算符。 您可能会有类似以下内容:
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()来获取函数的全局版本。
还应注意,名称解析发生在重载解析之前。 因此,如果您当前的作用域中存在具有相同名称的名称,那么它将停止寻找其他名称并尝试使用它们。
void bar() {};
class foo {
void bar(int) {};
void foobar() { bar(); } // won't compile needs ::bar()
void foobar(int i) { bar(i); } // ok
}
在全局名称空间中查找以范围解析运算符 ( ::
:)开头的名称。 通过查看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()将引用全局变量。
指全球范围