Maison >développement back-end >C++ >Comment résoudre l'ambiguïté dans les fonctions surchargées lors du passage de Lambdas comme arguments en C ?

Comment résoudre l'ambiguïté dans les fonctions surchargées lors du passage de Lambdas comme arguments en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-19 07:40:031009parcourir

How to Resolve Ambiguity in Overloaded Functions When Passing Lambdas as Arguments in C  ?

Résoudre l'ambiguïté dans les fonctions surchargées pour les Lambdas

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 :

foo(+[](){}); // not ambiguous (calls the function pointer overload)

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 :

The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type, and the result is the value of the argument.

É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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn