静态和常量如何解决不明确的函数调用

How do static and const resolve ambigous function calls?

本文关键字:解决 不明确 函数调用 常量 何解决 静态      更新时间:2023-10-16

我目前正在尝试理解函数调用的概念,并注意到你可以写出可怕的代码,但仍然可以通过滥用隐式转换、const 和静态来使其工作。

现在我想了解为什么,尤其是它是如何工作的。例如,下面是我用于测试的代码片段。

标有 (1( 的行需要a_const需要它的const修饰符,并且有一个 static 函数需要或多或少适当的参数。删除这两个中的任何一个都会导致编译错误。那么这是如何工作的呢?

#include <iostream>
struct A {
static void func(const int a, int b) {
    std::cout << "A-1"<<std::endl;
}
void func(const int a, float b) {
    std::cout << "A0"<<std::endl;
}
void func(double a, float b) {
    std::cout << "A1"<<std::endl;
}
void func(unsigned int a, char b) {
    std::cout << "A2"<<std::endl;
}
void func(float a, int b) {
    std::cout << "A3"<<std::endl;
}
};
int main() {
const A a_const;
A a;
a_const.func(1.f,1.f); // (1)
// a.func(1.f,1.f);    // (2)
return 0;
}
a.func(1.f,1.f);

这是一个模棱两可的调用,因为所有匹配A::func并且没有一个比另一个更好匹配。


a_const.func(1.f,1.f);

不是一个模棱两可的调用,因为a_const常量合格的,所以所有非常量A::func都不匹配。重载集只剩下static成员函数。