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!