我想知道为什么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)?
为什么编译器不能简单选择
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);