Lors de l'utilisation du modèle std::function, ambiguïté peut survenir en raison de plusieurs surcharges plausibles. Plus précisément, considérez l'extrait de code suivant :
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
L'ambiguïté vient du fait que function
La signature de l'argument de modèle pour std::function est considérée comme faisant partie de son type lors de la déclaration et de la définition. Cependant, ce n'est pas le cas lors de la construction d'un objet.
std::function, comme de nombreux objets fonctionnels en C , utilise une technique appelée effacement de type. Cela lui permet d'accepter des objets ou des fonctions arbitraires, à condition qu'ils satisfassent à la signature attendue lors de leur appel. L'inconvénient est que les erreurs liées aux signatures incompatibles se produisent au plus profond de l'implémentation, plutôt qu'au niveau du constructeur.
Trois options principales existent pour contourner cette ambiguïté :
Alors que l'argument de modèle de std::function détermine son type lors des déclarations et des définitions, il ne joue aucun rôle dans la construction d'objets. Cela peut conduire à une ambiguïté lorsque les constructeurs acceptent des arguments arbitraires. Pour résoudre ce problème, les programmeurs peuvent utiliser la conversion de type explicite, l'encapsulation d'objet de fonction ou TMP.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3