我想知道为什么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)
?
答案 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);
。