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

时间:2019-03-24 15:51:05

标签: c++

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

我已阅读文档here,其中指出

  

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

因此请考虑以下代码。

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

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

将静态成员函数用于非静态函数调用的重载解析,这很有意义。

A a;
a.foo(1, 1.f); //can safely call static method

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

1 个答案:

答案 0 :(得分: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);
   }
};

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

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