在 C++ 类成员函数中调用 foo() 和 ::foo() 有什么区别?

Ed.*_*Ed. 5 c++ name-lookup scope-resolution-operator

我正在看别人的 C++ 代码(注意我对 C++ 不太流利)。

在类中,有一个成员函数:

void ClassYaba::funcname()
{
    ...
    ::foo();
    ...
}
Run Code Online (Sandbox Code Playgroud)

该类的命名空间中没有名为 的成员函数foo,但除此之外,::foo()foo()(没有前导冒号)之间有什么区别?

tem*_*def 7

你打电话时

foo();
Run Code Online (Sandbox Code Playgroud)

fooC++ 将按以下顺序搜索命名的内容:

  1. 类中是否声明了具有此名称的内容?
  2. 基类中是否有具有此名称的内容?
  3. 在声明该类的命名空间中是否存在具有该名称的内容?(如果没有,该名称空间的父名称空间中是否存在具有该名称的内容等?)
  4. 最后,如果没有找到任何东西,那么全局命名空间中是否存在具有该名称的内容?

另一方面,写

::foo();
Run Code Online (Sandbox Code Playgroud)

将使 C++ 纯粹在全局命名空间中查找某些内容。

foo如果您的类、其任何基类或其中声明的任何命名空间中没有任何命名foo,那么这两种方法之间没有区别。