Heim >Backend-Entwicklung >C++ >Wie kann der Unary Plus-Operator Mehrdeutigkeiten beim Überladen von Lambdas in C beheben?
Mehrdeutigkeitsauflösung für Lambda-Überladung mithilfe des Unary Plus-Operators
In C sorgt das Überladen einer Funktion durch die Bereitstellung mehrerer Implementierungen mit unterschiedlichen Parametertypen für Flexibilität bei der Wiederverwendung von Code. Beim Versuch, eine Funktion mit einem Lambda-Ausdruck aufzurufen, kann es jedoch zu Mehrdeutigkeiten kommen, wenn das Lambda mehrere Überladungen erfüllen kann.
Das Problem der Mehrdeutigkeit
Beachten Sie den folgenden Codeausschnitt :
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
Der erste Aufruf von foo mit dem Lambda-Ausdruck []() wird mehrdeutig, da der Compiler nicht bestimmen kann, welche Überladung verwendet werden soll. Sowohl die std::function- als auch die Funktionszeigerüberladungen sind brauchbare Kandidaten.
Auflösen von Mehrdeutigkeiten mit dem unären Plus-Operator
Die Notation, in diesem Fall der unäre Plus-Operator , kann verwendet werden, um diese Mehrdeutigkeit aufzulösen. Durch Platzieren des unären Pluszeichens vor dem Lambda-Ausdruck wird eine Konvertierung in den Funktionszeigertyp erzwungen:
foo(+[](){});
Diese Konvertierung führt dazu, dass der Funktionszeiger die genaue Übereinstimmung für den Argumenttyp void (*)() überlädt. und beseitigt die Mehrdeutigkeit.
Der unäre Plusoperator
Der im C-Standard definierte unäre Plusoperator hat die folgende Eigenschaft:
"The Der Operand des unären Operators muss einen arithmetischen Typ, eine Aufzählung ohne Gültigkeitsbereich oder einen Zeigertyp haben und das Ergebnis ist der Wert des Arguments aufgrund der Eigenschaften seines Verschlusstyps in void (*)() konvertiert werden. Der Abschlusstyp für ein Lambda verfügt über eine nicht explizite Konvertierungsfunktion in einen Funktionszeiger mit denselben Parameter- und Rückgabetypen wie der Funktionsaufrufoperator des Lambda.
Auswahl der FunktionszeigerüberladungDa das unäre Plus die Konvertierung in void (*)() erzwingt, wird die zweite Überladung, void foo(void (*f)()), zu einer exakten Übereinstimmung in der Rangfolge der Überladungsauflösung. Da es sich um die einzige exakte Übereinstimmung handelt, wird sie eindeutig ausgewählt.
Alternative AnsätzeAlternativ besteht die Möglichkeit, das Lambda explizit in den Funktionszeigertyp umzuwandeln, um Mehrdeutigkeiten zu vermeiden kann verwenden:
Das obige ist der detaillierte Inhalt vonWie kann der Unary Plus-Operator Mehrdeutigkeiten beim Überladen von Lambdas in C beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!