En C, lors de l'appel d'une fonction avec un lambda comme argument, une ambiguïté peut survenir s'il existe plusieurs surcharges qui correspondent au le type de lambda. Cela peut entraîner des erreurs de compilation.
Considérez le code suivant :
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
Dans ce code, il y a deux surcharges de foo : l'une prenant un std::function Pour résoudre cette ambiguïté, vous pouvez utiliser l'opérateur unaire plus ( ) avant le lambda, comme indiqué ci-dessous : L'opérateur plus force la conversion du lambda en pointeur de fonction, permettant à la deuxième surcharge de foo de correspondre exactement et d'être appelée sans ambiguïté. Ce comportement découle de la capacité de l'opérateur unaire plus à convertir certains types, y compris les lambdas, en pointeurs de fonction. Cette fonction de conversion est définie comme suit : Étant donné que le type de fermeture du lambda a une fonction de conversion en pointeur de fonction, l'opérateur unaire plus convertit le lambda en type de pointeur de fonction souhaité, permettant une correspondance exacte dans résolution de surcharge. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!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.