Surcharge booléenne de correspondance littérale de chaîne au lieu de std::string
Considérez le code C 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; } };</code>
Lorsque vous appelez la méthode comme suit :
<code class="cpp">Output::Print("Hello World");</code>
Vous pourriez être surpris de voir le résultat :
True
Pourquoi la surcharge booléenne de la méthode Print a-t-elle été appelée au lieu du std : :surcharge de chaînes ?
Comprendre le mécanisme de conversion
Les littéraux de chaîne en C, tels que "Hello World", sont stockés sous forme de tableaux de caractères const. Cependant, ils peuvent être implicitement convertis en pointeurs vers des caractères const, qui peuvent ensuite être convertis en bool.
Dans le code fourni, le compilateur préfère la séquence de conversion standard de "Hello World" pour bool plutôt que l'utilisateur. séquence de conversion définie de "Hello World" en std :: string. Cette préférence est basée sur la norme C, qui stipule que les séquences de conversion standard ont priorité sur les séquences de conversion définies par l'utilisateur.
Résoudre le problème
Pour garantir que le standard ::string surcharge est appelé, transmettez explicitement un argument std::string:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
Ce faisant, vous forcez le compilateur à utiliser la surcharge std::string, qui affichera correctement "Hello World" .
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!