Heim  >  Artikel  >  Backend-Entwicklung  >  Wie löst der Unary Plus-Operator Mehrdeutigkeiten bei der Funktionsüberladung mit Lambda-Ausdrücken?

Wie löst der Unary Plus-Operator Mehrdeutigkeiten bei der Funktionsüberladung mit Lambda-Ausdrücken?

Barbara Streisand
Barbara StreisandOriginal
2024-11-16 01:38:02202Durchsuche

How does the Unary Plus Operator Resolve Ambiguity in Function Overloading with Lambda Expressions?

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 f), ist keine exakte Übereinstimmung.

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!

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