In C , class methods can be overloaded to accept different parameter types. However, sometimes a string literal may unexpectedly matched the boolean type overload instead of the expected std::string overload.
Problem description:
Suppose we have an Output class defined as follows:
<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>
When calling Output::Print("Hello World "), the output result is "True" instead of the expected "Hello World".
Problem analysis:
Although we defined the std::string overload, "Hello World" is actually a character array constant that can be implicitly converted to bool. The compiler prefers this standard conversion over the user-defined std::string conversion constructor.
According to the C standard (§13.3.3.2/2), standard conversion orders prevail over user-defined conversion orders. Therefore, the compiler chooses the bool overload because it has better conversion order.
Workaround:
In order to explicitly call the std::string overload, we need to explicitly pass "Hello World" as std::string:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
The above is the detailed content of Why does `Output::Print(\'Hello World\')` print \'True\' instead of \'Hello World\'?. For more information, please follow other related articles on the PHP Chinese website!