In C kann es beim Aufrufen einer Funktion mit einem Lambda als Argument zu Mehrdeutigkeiten kommen, wenn mehrere Überladungen vorhanden sind, die mit dem übereinstimmen Lambda-Typ. Dies kann zu Kompilierungsfehlern führen.
Bedenken Sie den folgenden Code:
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
In diesem Code gibt es zwei Überladungen von foo: eine, die eine std::function Um diese Mehrdeutigkeit aufzulösen, können Sie den unären Plusoperator ( ) vor dem verwenden Lambda, wie unten gezeigt: Der Plus-Operator erzwingt die Konvertierung des Lambda in einen Funktionszeiger, wodurch die zweite Überladung von foo genau abgeglichen und ohne aufgerufen werden kann Mehrdeutigkeit. Dieses Verhalten ergibt sich aus der Fähigkeit des unären Plus-Operators, bestimmte Typen, einschließlich Lambdas, in Funktionszeiger umzuwandeln. Diese Konvertierungsfunktion ist wie folgt definiert: Da der Verschlusstyp des Lambda eine Konvertierungsfunktion in einen Funktionszeiger hat, konvertiert der unäre Plusoperator das Lambda in den gewünschten Funktionszeigertyp und ermöglicht so eine genaue Übereinstimmung Überlastungsauflösung. Das obige ist der detaillierte Inhalt vonWie löst man Mehrdeutigkeiten in überladenen Funktionen auf, wenn Lambdas als Argumente in C übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!foo(+[](){}); // not ambiguous (calls the function pointer overload)
The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type, and the result is the value of the argument.