Maison >développement back-end >C++ >Pourquoi « Hello World » s'imprime-t-il comme « Vrai » dans une méthode d'impression C surchargée ?
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 ?
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.
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.
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".
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!