Heim > Backend-Entwicklung > C++ > Hauptteil

Wie löst der unäre Operator Mehrdeutigkeiten auf, wenn eine Funktion mit einem Lambda-Ausdruck als Argument aufgerufen wird?

Patricia Arquette
Freigeben: 2024-11-14 16:22:02
Original
327 Leute haben es durchsucht

How does the unary   operator resolve ambiguity when calling a function with a lambda expression as an argument?

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
}
Nach dem Login kopieren

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 und void (*f)().

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:

  • Der unäre Operator Konvertiert das Argument in seinen zugrunde liegenden Typ (Arithmetik, Aufzählung oder Zeiger).
  • Bei Lambda-Ausdrücken ist die Konvertierungsfunktion im Abschlusstyp explizit wird in einen Funktionszeiger mit denselben Parameter- und Rückgabetypen konvertiert.

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 (*)())([]() {}));
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage