Heim > Artikel > Backend-Entwicklung > Wie löst der unäre Operator Mehrdeutigkeiten auf, wenn eine Funktion mit einem Lambda-Ausdruck als Argument aufgerufen wird?
Mehrdeutige Überlastung mit unärem Operator für Lambda-Funktionen auflösen
Im bereitgestellten Codeausschnitt:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // resolves to function pointer overload }
Das erste Der Aufruf von foo ist nicht eindeutig und kann nicht kompiliert werden. Diese Mehrdeutigkeit ergibt sich aus der Tatsache, dass der Lambda-Ausdruck implizit sowohl in std::function
Um diese Mehrdeutigkeit aufzulösen, wird im zweiten Aufruf der unäre Operator vor dem Lambda verwendet. Der Operator konvertiert den Lambda-Ausdruck in einen Funktionszeigertyp, void (*)(), der genau mit der zweiten Überladung übereinstimmt.
Gemäß dem C-Standard:
Daher führt der Ausdruck []() {} zu einem void (*)()-Funktionszeiger, der eindeutig mit der zweiten Überladung übereinstimmt .
Es ist wichtig zu beachten, dass der Lambda-Ausdruck auch explizit in einen Funktionszeigertyp umgewandelt werden kann, um Mehrdeutigkeiten zu vermeiden:
foo((void (*)())([]() {}));
Das obige ist der detaillierte Inhalt vonWie löst der unäre Operator Mehrdeutigkeiten auf, wenn eine Funktion mit einem Lambda-Ausdruck als Argument aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!