Mehrdeutigkeitsauflösung bei Funktionsüberladung mit Unary Plus
Im angegebenen Codeausschnitt:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // not ambiguous (calls the function pointer overload) }
Der erste Aufruf to foo mit dem Lambda-Ausdruck als Argument kann aufgrund von Mehrdeutigkeit nicht kompiliert werden. Der zweite Aufruf mit dem Unären vor dem Lambda führt jedoch zur Funktionszeigerüberladung.
Die Rolle von Unary Plus
Der in [] verwendete Operator ist der Unäre plus Betreiber. Im C-Standard ist es als Konvertierung eines Operanden vom arithmetischen Typ, einer Aufzählung ohne Gültigkeitsbereich oder eines Zeigertyps in den Wert des Operanden definiert.
In diesem Fall kann der Lambda-Ausdruck, obwohl er nicht vom arithmetischen Typ ist, konvertiert werden in einen Funktionszeigertyp.
Konvertierung in einen Funktionszeigertyp
Gemäß dem C-Standard verfügt ein Lambda-Ausdruck ohne Lambda-Erfassung über eine öffentliche Konvertierungsfunktion, auf die er zeigen kann Funktion mit denselben Parameter- und Rückgabetypen wie der Funktionsaufrufoperator des Lambda.
Daher erzwingt das Unäre die Konvertierung des Lambda-Ausdrucks in den Funktionszeigertyp void (*)().
Überladungsauflösung
Die zweite Überladung, void foo(void (*f)()), wird bei der Überladungsauflösung zu einer exakten Übereinstimmung, da der Argumenttyp, void (*)(), entspricht dem Parametertyp. Die erste Überladung, void foo(std::function
Daher wird die zweite Überladung eindeutig ausgewählt, wodurch die Mehrdeutigkeit im ersten Aufruf behoben wird .
Überlegungen
Während der unäre Trick zum Auflösen von Überlastungsmehrdeutigkeiten nicht explizit im C-Standard spezifiziert ist, wird er allgemein als zuverlässiges Verhalten angesehen.
Es wird jedoch empfohlen, eine explizite Umwandlung in den Funktionszeigertyp zu verwenden, um mögliche Verwirrung oder zukünftige Änderungen in der Interpretation des Standards zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie löst der Unary Plus-Operator Mehrdeutigkeiten bei der Funktionsüberladung mit Lambda-Ausdrücken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!