为什么C++中函数重载解析考虑静态调用的非静态成员函数? 我想知道为什么C++中函数重载解析在调用静态方法时会考虑非静态成员函数。
我已经阅读了文档,其中说明 如果任何候选函数是静态或非静态的成员函数,但不是构造函数,则将其视为具有一个额外的参数隐式对象参数,该参数表示为其调用的对象,并显示在第一个实际参数之前为什么C++中函数重载解析考虑静态调用的非静态成员函数? 我想知道为什么C++中函数重载解析在调用静态方法时会考虑非静态成员函数。,c++,C++,我已经阅读了文档,其中说明 如果任何候选函数是静态或非静态的成员函数,但不是构造函数,则将其视为具有一个额外的参数隐式对象参数,该参数表示为其调用的对象,并显示在第一个实际参数之前 考虑下面的代码。 struct A { static void foo(int a, float b){...} void foo(float a, int b){...} }; 那么调用A::foo1.f,1.f是不明确的 静态成员函数用于非静态函数调用的重载解析,这很有意义 A a; a.foo(1
考虑下面的代码。
struct A {
static void foo(int a, float b){...}
void foo(float a, int b){...}
};
那么调用A::foo1.f,1.f是不明确的
静态成员函数用于非静态函数调用的重载解析,这很有意义
A a;
a.foo(1, 1.f); //can safely call static method
但是,在使用Class::function调用函数时,为什么还要考虑非静态成员函数呢?为什么编译器不能简单地选择静态void fooint a,float b
为什么编译器不能简单地选择静态void fooint a,float b
我对您的问题的理解是,由于非实例A::前缀,您假定语法A::foo是明确的。但看看这个场景:
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::前缀可以引用静态和非静态成员函数,具体取决于上下文。编译器不能假定它只引用静态成员函数
还有更多的场景需要像::foo这样的限定非静态成员函数调用,例如在菱形继承结构中,如果不使用虚拟继承。这就是为什么任何成员函数都可以像这样调用,即使它是不必要的、没有意义的:A;a、 a::foo1,2.f
为什么编译器不能简单地选择静态void fooint a,float b
我对您的问题的理解是,由于非实例A::前缀,您假定语法A::foo是明确的。但看看这个场景:
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::前缀可以引用静态和非静态成员函数,具体取决于上下文。编译器不能假定它只引用静态成员函数
还有更多的场景需要像::foo这样的限定非静态成员函数调用,例如在菱形继承结构中,如果不使用虚拟继承。这就是为什么任何成员函数都可以像这样调用,即使它是不必要的、没有意义的:A;a、 a::foo1,2.f 我90%肯定A是畸形的。你是什么意思?它应该编译得很好,没有模棱两可的调用。。。你说得对。我误认为您的示例具有完全相同的参数类型,对我来说,这是一天的结束。抱歉,A不是格式错误的。您可以使用class::syntax调用非静态成员。编译器无法仅从该语法就知道您调用的是静态函数还是非静态函数。您是对的!我不明白为什么我会得到这么多的反对票。对于有经验的C++开发者来说,这可能是个愚蠢的问题,但如果你不考虑继承,那就不是很明显了。我90%肯定A是伪造的。你是什么意思?它应该编译得很好,没有模棱两可的调用。。。你说得对。我误认为您的示例具有完全相同的参数类型,对我来说,这是一天的结束。抱歉,A不是格式错误的。您可以使用class::syntax调用非静态成员。编译器无法仅从该语法就知道您调用的是静态函数还是非静态函数。您是对的!我不明白为什么我会得到这么多的反对票。对于有经验的C++开发人员来说,这可能是个愚蠢的问题,但如果你不考虑继承,那就不是很明显了。