Maison > développement back-end > C++ > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-06 00:42:02
original
964 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!