Maison  >  Article  >  développement back-end  >  Pourquoi « std :: function » entraîne-t-il une ambiguïté dans les signatures d'arguments de modèles ?

Pourquoi « std :: function » entraîne-t-il une ambiguïté dans les signatures d'arguments de modèles ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-06 00:42:021039parcourir

Why Does `std::function` Lead to Ambiguity in Template Argument Signatures?

Ambiguïté dans les signatures d'arguments du modèle std::function

L'ambiguïté survient lorsque les deux fonctions et la fonction peut être construit à partir de la même fonction. Comme std::function repose sur l'effacement de type, il peut accepter des fonctions arbitraires, même si leurs signatures ne correspondent pas à la signature de l'argument du modèle.

Pour illustrer cela, considérons la classe :

<code class="cpp">template<class Signature>
class myfunc{
public:
    template<class Func>
    myfunc(Func a_func){
        // ...
    }
};</code>

Lorsque le compilateur tente de trouver des fonctions viables pour un ensemble de surcharge, il recherche des conversions potentielles. Dans ce cas, les deux constructeurs de myfunc acceptent n'importe quoi, permettant la conversion de int(*)() en myfunc et de int(*)() à myfunc pour réussir.

Ainsi, lors de l'appel de a(x) ou a(y), le compilateur rencontre deux fonctions viables, ce qui entraîne une ambiguïté.

Résolution

La signature de l'argument modèle de std::function fait partie de son type lors de la déclaration et de la définition des fonctions. Cependant, lors de la construction de l'objet, la signature est ignorée.

Pour contourner l'ambiguïté, on peut :

  • Convertir explicitement l'argument en la signature souhaitée (par exemple, (function)(x)).
  • Créez un objet fonction du type approprié et transmettez-le.
  • Utilisez la métaprogrammation de modèle (TMP) pour extraire la signature et la lancer automatiquement.

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