不带作用域的作用域解析运算符

77

C++中,如果在没有作用域的情况下使用作用域解析运算符,它的目的是什么?例如:

::foo();
6个回答

92

它表示全局作用域。当您在同一作用域中具有冲突的函数或变量,并且需要使用全局变量时,可能需要使用此运算符。您可能会遇到类似以下的情况:

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()来获取该函数的全局版本。

2
为什么它无法编译? - Lightness Races in Orbit
需要在这里补充说明,在匿名命名空间中定义的内容也可以使用一元作用域运算符进行调用: - jaques-sam

15

作用域解析运算符::)开头的名称在全局命名空间中查找。我们可以通过查看C++草案标准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;
}

文本内容很类似,可以追溯至N1804,这是最早可用的草案标准。

10
此外,您应该注意,在重载解析之前会发生名称解析。因此,如果在当前作用域中有相同名称的内容,则会停止查找其他名称并尝试使用它们。
void bar() {};
class foo {
    void bar(int) {};
    void foobar() { bar(); } // won't compile needs ::bar()
    void foobar(int i) { bar(i); } // ok
}

5

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


4

我的c++有点生疏,但我认为如果在本地范围内声明了一个函数,比如foo(),并且在全局范围内也声明了一个foo(),那么foo()会指向本地的那个函数。而::foo()则会指向全局的那个函数。


2

指向全局作用域


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接