为什么C ++中的函数重载解析会考虑将非静态成员函数用于静态调用?

Noa*_*der 1 c++

我想知道为什么C ++中的函数重载解析在调用静态方法时确实考虑了非静态成员函数。

我在这里阅读了文档并指出

如果任何候选函数是成员函数(静态或非静态),而不是构造函数,则将其视为具有一个额外参数(隐式对象参数),该参数表示为其调用的对象并出现在第一个函数之前实际参数。

因此,请考虑以下代码。

struct A {
   static void foo(int a, float b){...}
   void foo(float a, int b){...}
};
Run Code Online (Sandbox Code Playgroud)

然后,通话A::foo(1.f, 1.f)是不明确的。

考虑使用静态成员函数来解决非静态函数调用的重载问题,这很有意义。

A a;
a.foo(1, 1.f); //can safely call static method
Run Code Online (Sandbox Code Playgroud)

但是,为什么还要用另一种方法(用调用函数时考虑非静态成员函数Class::function)呢?为什么编译器不能简单选择static void foo(int a, float b)

lub*_*bgr 5

为什么编译器不能简单选择static void foo(int a, float b)

我对您的问题的理解是,A::foo由于非实例A::前缀,您假定语法是明确的。但是看看这种情况:

struct A {
   static void foo(int, float);
   void foo(float, int);
};

struct B : A {
   // Hide the base class foo
   void foo()
   {
      // Now explicitly call it... this is ambiguous!
      A::foo(1.f, 1.f);
   }
};
Run Code Online (Sandbox Code Playgroud)

因此,根据上下文,A::前缀可以同时指代static和非static成员函数。编译器不能假定它static仅引用成员函数。

在更多情况下,例如在菱形继承结构中(如果您不使用继承),则必须进行合格的非static成员函数调用。这就是为什么可以像这样调用任何成员函数的原因(即使在不必要且没有意义的情况下也是如此:)。A::foovirtualA a; a.A::foo(1, 2.f);