Stephan T. Lavavej erklärte den Fall, über den er sprach, in einem Tweet :
Der Fall, an den ich gedacht habe, ist, wo Sie die Adresse einer überladenen / vorlagengesteuerten Funktion verwenden können und wenn sie zum Initialisieren einer Variablen eines bestimmten Typs verwendet wird, wird dadurch eindeutig, welche Sie möchten. (Es gibt eine Liste, was eindeutig ist.)
Beispiele hierfür finden Sie auf der cppreference-Seite unter Adresse der überladenen Funktion . Ich habe einige davon unten ausgenommen:
int f(int) { return 1; }
int f(double) { return 2; }
void g( int(&f1)(int), int(*f2)(double) ) {}
int main(){
g(f, f); // selects int f(int) for the 1st argument
// and int f(double) for the second
auto foo = []() -> int (*)(int) {
return f; // selects int f(int)
};
auto p = static_cast<int(*)(int)>(f); // selects int f(int)
}
Michael Park fügt hinzu :
Es ist auch nicht auf die Initialisierung eines konkreten Typs beschränkt. Es könnte auch nur aus der Anzahl der Argumente schließen
und bietet dieses Live-Beispiel :
void overload(int, int) {}
void overload(int, int, int) {}
template <typename T1, typename T2,
typename A1, typename A2>
void f(void (*)(T1, T2), A1&&, A2&&) {}
template <typename T1, typename T2, typename T3,
typename A1, typename A2, typename A3>
void f(void (*)(T1, T2, T3), A1&&, A2&&, A3&&) {}
int main () {
f(&overload, 1, 2);
}
was ich hier etwas näher erläutere .