Maison >développement back-end >C++ >Comment l'opérateur Unary Plus peut-il résoudre l'ambiguïté lors de la surcharge de Lambdas en C ?
Résolution d'ambiguïté pour la surcharge Lambda à l'aide de l'opérateur Unary Plus
En C, la surcharge d'une fonction en fournissant plusieurs implémentations avec différents types de paramètres permet une certaine flexibilité dans la réutilisation du code. Cependant, lorsque vous tentez d'appeler une fonction avec une expression lambda, une ambiguïté peut survenir si la lambda peut satisfaire plusieurs surcharges.
Le problème d'ambiguïté
Considérez l'extrait de code suivant :
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
Le premier appel à foo avec l'expression lambda []() devient ambigu car le compilateur ne peut pas déterminer quelle surcharge utiliser. Les surcharges de std::function et de pointeur de fonction sont des candidats viables.
Résoudre l'ambiguïté avec l'opérateur unaire plus
La notation, dans ce cas l'opérateur unaire plus , peut être utilisé pour résoudre cette ambiguïté. En plaçant le plus unaire avant l'expression lambda, cela force une conversion vers le type de pointeur de fonction :
foo(+[](){});
Cette conversion fait que le pointeur de fonction surcharge la correspondance exacte pour le type d'argument, void (*)() , et élimine l'ambiguïté.
L'opérateur unaire plus
L'opérateur unaire plus défini dans la norme C a la propriété suivante :
"Le L'opérande de l'opérateur unaire doit avoir un type arithmétique, énumération sans portée ou pointeur et le résultat est la valeur de l'argument."
Dans le cas d'un lambda, bien qu'il n'ait pas de type arithmétique ou pointeur, il peut être converti en void (*)() en raison des propriétés de son type de fermeture. Le type de fermeture d'un lambda a une fonction de conversion non explicite en un pointeur de fonction avec le même paramètre et les mêmes types de retour que l'opérateur d'appel de fonction du lambda.
Choisir la surcharge du pointeur de fonction
Avec le plus unaire forçant la conversion en void (*)(), la deuxième surcharge, void foo(void (*f)()), devient une correspondance exacte dans le classement de résolution de surcharge. Puisqu'il s'agit de la seule correspondance exacte, elle est choisie sans ambiguïté.
Approches alternatives
Alternativement, pour convertir explicitement le lambda en type de pointeur de fonction pour éviter toute ambiguïté, une peut utiliser :
foo(static_cast<void (*)()>([](){}));
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!