Maison >développement back-end >C++ >Comment l'opérateur Unary Plus résout-il l'ambiguïté liée à la surcharge de fonctions avec des expressions Lambda ?
Résolution d'ambiguïté dans la surcharge de fonctions à l'aide d'Unary Plus
Dans l'extrait de code donné :
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // not ambiguous (calls the function pointer overload) }
Le premier appel to foo avec l'expression lambda en tant qu'argument ne parvient pas à être compilé en raison d'une ambiguïté. Cependant, le deuxième appel avec l'unaire avant que le lambda ne résout la surcharge du pointeur de fonction.
Le rôle de Unary Plus
L'opérateur utilisé dans [] est l'unaire plus opérateur. Il est défini dans le standard C comme la conversion d'un opérande de type arithmétique, énumération sans portée ou pointeur en la valeur de l'opérande.
Dans ce cas, bien que l'expression lambda ne soit pas de type arithmétique, elle peut être convertie en un type de pointeur de fonction.
Conversion en pointeur de fonction Type
Selon la norme C, une expression lambda sans capture lambda a une fonction de conversion publique pour pointer vers une fonction avec le même paramètre et les mêmes types de retour que l'opérateur d'appel de fonction lambda.
Par conséquent, l'unaire force la conversion de l'expression lambda en type pointeur de fonction, void (*)().
Résolution de surcharge
La deuxième surcharge, void foo(void (*f)()), devient une correspondance exacte dans la résolution de surcharge car le type d'argument, void (*)(), correspond au type de paramètre. La première surcharge, void foo(std::function
En conséquence, la deuxième surcharge est choisie sans ambiguïté, résolvant l'ambiguïté du premier appel. .
Considérations
Bien que l'astuce unaire pour résoudre l'ambiguïté de surcharge soit non explicitement spécifié dans la norme C, il est généralement considéré comme un comportement fiable.
Cependant, il est recommandé d'utiliser un transtypage explicite vers le type de pointeur de fonction pour éviter toute confusion potentielle ou tout changement futur dans l'interprétation de la norme. .
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!