没有范围的范围解析运算符

时间:2008-09-16 18:06:51

标签: c++

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

::foo();

6 个答案:

答案 0 :(得分:64)

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

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 :(得分:7)

此外,您应该注意,名称解析在重载解析之前发生。因此,如果当前范围内存在同名的内容,则会停止查找其他名称并尝试使用它们。

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

答案 2 :(得分:5)

在全局命名空间中查找以scope resolution operator ::)开头的名称。我们可以通过查看draft C++ standard部分3.4.3 合格名称查找 4 来看到这一点(强调我的 ):

  

在使用它的翻译单元中,在全局范围中查找以一元范围运算符::(5.1)为前缀的名称。该名称应在全局命名空间范围内声明,或者是一个名称,其声明在全局范围内可见,因为using-directive(3.4.3.2)。使用:: 允许引用全局名称,即使其标识符已被隐藏(3.3.10)。

正如标准所述,这允许我们使用全局命名空间that would otherwise be hidden中的名称,链接文档中的示例如下:

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,这是最早的标准草案。

答案 3 :(得分:3)

如果您已在本地范围内拥有名为foo()的函数,但您需要访问全局范围内的函数。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

指的是全球范围