无作用域的作用域解析运算符 在C++中,没有使用范围时,范围解析操作符的目的是什么?例如: ::foo(); 当您在本地范围内有一个名为FO的函数但您需要访问全局范围中的一个函数时,请参阅全局范围

无作用域的作用域解析运算符 在C++中,没有使用范围时,范围解析操作符的目的是什么?例如: ::foo(); 当您在本地范围内有一个名为FO的函数但您需要访问全局范围中的一个函数时,请参阅全局范围,c++,C++,指的是全局范围。当同一作用域中存在冲突的函数或变量且需要使用全局运算符时,可能需要使用此运算符。您可能会遇到以下情况: 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();

指的是全局范围。当同一作用域中存在冲突的函数或变量且需要使用全局运算符时,可能需要使用此运算符。您可能会遇到以下情况:

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
}

在全局命名空间中查找以::开头的名称。我们可以通过查看第3.4.3节限定名称查找第4段看到这一点,该段说:

以一元范围运算符::5.1为前缀的名称将在全局范围中的使用单位中查找。该名称应在全局名称空间范围内声明,或应是由于using指令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;
}

措辞非常相似,可以追溯到最早的标准草案

为什么它不会编译?需要在此添加一点,即您在匿名命名空间中定义的内容也可以使用一元范围运算符调用: