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)'
2 odpowiedzi
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.
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.
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .