Maison > développement back-end > C++ > Pourquoi « Hello World » s'imprime-t-il comme « Vrai » dans une méthode d'impression C surchargée ?

Pourquoi « Hello World » s'imprime-t-il comme « Vrai » dans une méthode d'impression C surchargée ?

Linda Hamilton
Libérer: 2024-11-14 11:05:02
original
298 Les gens l'ont consulté

Why Does

Ambiguïté littérale de chaîne dans les méthodes surchargées

En C, lors de la surcharge de méthodes qui acceptent plusieurs types, il est essentiel d'être conscient de l'ambiguïté potentielle. Comme illustré ci-dessous :

<code class="cpp">class Output
{
public:
    static void Print(bool value)
    {
        std::cout << (value ? "True" : "False");
    }

    static void Print(std::string value)
    {
        std::cout << value;
    }
};</code>
Copier après la connexion

Si nous essayons d'appeler la méthode Print avec une chaîne littérale comme suit :

<code class="cpp">Output::Print("Hello World");</code>
Copier après la connexion

De façon inattendue, le résultat est "True" au lieu de "Hello World ". Pourquoi ?

Littéraux de chaîne et conversions définies par l'utilisateur

En C, les littéraux de chaîne comme "Hello World" ne sont pas de type std::string mais plutôt un tableau de caractères constants. Cependant, ils peuvent être implicitement convertis en valeur booléenne. Cette conversion, connue sous le nom de séquence de conversion standard, est préférée par le compilateur au constructeur de conversion défini par l'utilisateur pour std::string.

Résolution de surcharge et conversions standard

Pendant la résolution de surcharge, le compilateur détermine la meilleure fonction à appeler pour chaque argument. La préférence est donnée aux séquences de conversion standard plutôt qu'aux conversions définies par l'utilisateur. Dans notre cas, la conversion standard de "Hello World" en bool est considérée comme meilleure que la conversion définie par l'utilisateur en std::string.

Comment éviter l'ambiguïté

Pour garantir que le std ::string surcharge est utilisée, nous devons passer explicitement un argument std::string :

<code class="cpp">Output::Print(std::string("Hello World"));</code>
Copier après la connexion

Cela résout l'ambiguïté et affiche correctement "Bonjour World".

Conclusion

Comprendre les conversions implicites et leur impact sur la résolution des surcharges est crucial en C . Par défaut, les conversions standards sont prioritaires sur les conversions définies par l'utilisateur. Par conséquent, il est essentiel d'être conscient de ces conversions et d'effectuer des conversions de type explicites si nécessaire pour éviter un comportement inattendu.

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 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