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

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

Patricia Arquette
Patricia ArquetteOriginal
2024-11-14 16:22:02329Durchsuche

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
}

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

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!

Stellungnahme:
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