在C ++中,在没有范围的情况下使用范围解析运算符的目的是什么? 例如:
它意味着全球范围。如果在同一范围内存在冲突的函数或变量,并且需要使用全局函数或变量,则可能需要使用此运算符。你可能有类似的东西:
1 2 3 4 5 6
| 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()来获取函数的全局版本。
此外,您应该注意,名称解析在重载解析之前发生。因此,如果当前范围中存在具有相同名称的内容,则它将停止查找其他名称并尝试使用它们。
1 2 3 4 5 6
| 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段来看到(强调我的):
A name prefixed by the unary scope operator :: (5.1) is looked up in global scope, in the translation unit where it is used. The name shall be declared in global namespace scope or shall be a name whose declaration is visible in global scope because of a using-directive (3.4.3.2). The use of :: allows a global name to be referred to even if its identifier has been hidden (3.3.10).
作为标准状态,这允许我们使用否则将被隐藏的全局命名空间中的名称,链接文档中的示例如下所示:
1 2 3 4 5 6 7 8
| 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()将引用全局的。
指的是全球范围