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

时间:2020-03-05 18:56:43  来源:igfitidea点击:

在C ++中,不带范围使用范围解析运算符的目的是什么?例如:

::foo();

解决方案

回答

指全球范围

回答

如果在本地作用域中已经有一个名为foo()的函数,但是我们需要在全局作用域中访问该函数。

回答

我的c ++生锈了,但是我相信如果我们有一个在局部范围内声明的函数,例如foo()和一个在全局范围内声明的函数,则foo()则是指局部的。 :: 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
}