Maison > développement back-end > C++ > Pourquoi `Output::Print(\'Hello World\')` imprime-t-il \'True\' au lieu de \'Hello World\' ?

Pourquoi `Output::Print(\'Hello World\')` imprime-t-il \'True\' au lieu de \'Hello World\' ?

Barbara Streisand
Libérer: 2024-11-02 06:53:02
original
885 Les gens l'ont consulté

Why does `Output::Print(

Conflit de surcharge de littéral de chaîne : Bool vs std::string

En C, les méthodes de classe peuvent être surchargées pour accepter différents types de paramètres. Cependant, il arrive parfois qu'un littéral de chaîne soit surchargé. peut correspondre de manière inattendue à la surcharge de type booléen au lieu de la surcharge std::string attendue.

Description du problème :

Supposons que nous ayons une classe Output définie comme suit :

<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

Lors de l'appel de Output::Print("Hello World "), le résultat de sortie est "True" au lieu du "Hello World" attendu.

Analyse du problème :

Bien que nous ayons défini la surcharge std::string, "Hello World" est en fait une constante de tableau de caractères qui peut être implicitement convertie en booléen. Le compilateur préfère cette conversion standard au constructeur de conversion std::string défini par l'utilisateur.

Selon la norme C (§13.3.3.2/2), les ordres de conversion standards prévalent sur les ordres de conversion définis par l'utilisateur. Par conséquent, le compilateur choisit la surcharge booléenne car elle présente un meilleur ordre de conversion.

Solution :

Afin d'appeler explicitement la surcharge std::string, nous devons passer explicitement "Hello World" en tant que std::string:

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

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