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
Linda Hamiltonoriginal
2024-11-14 11:05:02258parcourir

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>

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>

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>

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