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