Как static и const разрешают неоднозначные вызовы функций? - PullRequest
1 голос
/ 28 марта 2019

В настоящее время я пытаюсь понять концепцию вызовов функций и заметил, что вы можете написать ужасный код, но все же можете заставить его работать, используя неявное преобразование, const и static.

Теперь я хотел бы понять, почему и особенно, как это работает. Например, ниже приведен фрагмент кода, который я использовал для тестирования.

Строка, отмеченная (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;
}

1 Ответ

0 голосов
/ 28 марта 2019
a.func(1.f,1.f);

Это неоднозначный вызов, потому что все A::func совпадают, и ни один из них не лучше, чем другой.


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

Не является двусмысленным вызовом, так как a_const соответствует const квалифицированному , все неконстантные A::func не совпадают. Набор перегрузки остается только с функцией-членом static.

...