Maison > développement back-end > C++ > Pourquoi une chaîne littérale appelle-t-elle une surcharge « bool » au lieu d'une surcharge « std::string » en C ?

Pourquoi une chaîne littérale appelle-t-elle une surcharge « bool » au lieu d'une surcharge « std::string » en C ?

Patricia Arquette
Libérer: 2024-11-04 10:12:01
original
860 Les gens l'ont consulté

Why does a string literal call a `bool` overload instead of a `std::string` overload in C  ?

Les littéraux de chaîne et la résolution de surcharge booléenne en C

En C, les méthodes surchargées vous permettent de définir plusieurs méthodes avec le même nom mais des paramètres différents genres. Cependant, trouver la surcharge exacte à exécuter peut parfois sembler inattendu. Explorons pourquoi un littéral de chaîne correspond à une surcharge booléenne au lieu d'une surcharge std::string dans certains cas.

Considérez le code suivant :

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

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

Lorsque nous appelons Output::Print avec "Hello World", nous pourrions nous attendre à ce qu'il imprime la chaîne littérale. Cependant, étonnamment, il affiche True. Cela se produit en raison des conversions implicites qui se produisent sous le capot.

En C , les chaînes littérales comme "Hello World" ont le type "tableau de 12 caractères const". Ils peuvent être implicitement convertis en un "pointeur vers const char", qui à son tour peut être implicitement converti en bool. Cette séquence de conversion standard est préférée à la séquence de conversion définie par l'utilisateur qui convertirait la chaîne littérale en std::string.

Conformément à la norme C (13.3.3.2/2), les séquences de conversion standard sont données plus haut priorité aux séquences de conversion définies par l'utilisateur lors de la résolution des surcharges. Étant donné que la conversion de la chaîne littérale en bool est une conversion standard, elle est prioritaire sur la conversion std::string et la surcharge Print(bool) est sélectionnée.

Pour garantir que la surcharge std::string est appelé, fournissez explicitement une valeur std::string :

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

Comprendre ces conversions implicites et ces règles de résolution de surcharge est crucial en C pour éviter toute confusion et garantir que la surcharge prévue est exécutée.

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