Rozważ następujące funkcje:

void f(int) {...}
void f(const int&) {...}

Są różne, a ich definicje skompilują się z powodzeniem. Ale czy istnieje sposób, aby zadzwonić do nich, gdy obaj uczestniczą w rozdzielczości przeciążeniowej? A jeśli nie ma mowy, dlaczego nie są uważane za tę samą funkcję jak te dwa:

void g(int) {...}
void g(const int) {...} // error: redefinition of 'void g(int)'
0
Lassie 12 marzec 2020, 19:50

2 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz wyraźnie wywołać określoną funkcję zestawu przeciążenia, możesz rzucić funkcję do wskaźnika funkcji z podpisem chcesz. To wyglądało

void f(int) { std::cout << "void f(int) \n"; }
void f(const int&) { std::cout << "void f(const int&)\n"; }

int main () 
{
    auto fi = static_cast<void(*)(int)>(f);
    auto fciref = static_cast<void(*)(const int&)>(f);
    fi(2);
    fciref(2);
}

Które wyjścia

void f(int) 
void f(const int&)

W przeciwnym razie nie możesz zadzwonić do swojej funkcji, ponieważ ani nie jest lepszy niż drugi zgodnie z regułami łamania krawatowego.

3
NathanOliver 12 marzec 2020, 17:06

Kompilator automatycznie usuwa najwyższy poziom const, dzięki czemu można powiedzieć, że dwa ostatnie są redefinicją. Nie można powiedzieć w pierwszym przykładzie, a kompilator nie dowie się, czy wywoływanie funkcji z zestawem argumentów spowoduje niejednoznaczność, dopóki nie zadzwonisz.

2
0x499602D2 12 marzec 2020, 17:00