Maison >développement back-end >C++ >Comment résoudre l'ambiguïté dans la surcharge du pointeur de fonction avec des expressions Lambda ?

Comment résoudre l'ambiguïté dans la surcharge du pointeur de fonction avec des expressions Lambda ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-20 00:20:03494parcourir

How to Resolve Ambiguity in Function Pointer Overloading with Lambda Expressions?

Résoudre l'ambiguïté dans la surcharge du pointeur de fonction avec des expressions Lambda à l'aide de l'opérateur Unary Plus

La surcharge d'une fonction avec un pointeur de fonction et une fonction std::function peut conduire à une ambiguïté lorsque essayer de passer une expression lambda comme argument. Cette ambiguïté provient du fait que les expressions lambda peuvent être implicitement converties à la fois en pointeurs de fonction et en std::functions.

Pour résoudre cette ambiguïté, l'opérateur unaire plus ( ) peut être utilisé avant l'expression lambda. L'opérateur force la conversion du lambda en un type de pointeur de fonction, qui dans ce cas est void ()(). Cela permet à la résolution de surcharge de sélectionner sans ambiguïté la surcharge du pointeur de fonction de foo(void (f)()).

Le code suivant démontre l'utilisation de l'opérateur pour résoudre l'ambiguïté :

#include <functional>

void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }

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

En comprenant les règles de conversion de type pour les expressions lambda et l'effet de l'opérateur unaire plus, nous pouvons résoudre efficacement l'ambiguïté dans la surcharge du pointeur de fonction lors du passage d'expressions lambda comme arguments.

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