Maison > Article > développement back-end > L'argument de modèle de « std :: function » influence-t-il son type lors de la construction de l'objet ?
Lors de l'utilisation du modèle std::function, ambiguïté peut survenir en raison de plusieurs surcharges plausibles. Plus précisément, considérons l'extrait de code suivant :
<code class="cpp">#include <functional> using namespace std; int a(const function<int()>& f) { return f(); } int a(const function<int(int)>& 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. }</code>
L'ambiguïté vient du fait que les deux fonctions
La signature de l'argument du 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é :
Bien que l'argument 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.
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!