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 ?

Comment l'opérateur Unary Plus résout-il l'ambiguïté liée à la surcharge de fonctions avec des expressions Lambda ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-16 01:38:02288parcourir

How does the Unary Plus Operator Resolve Ambiguity in Function Overloading with Lambda Expressions?

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 f), n'est pas une correspondance exacte.

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!

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