在 C 中,当重载接受多种类型的方法时,必须注意潜在的歧义。如下图所示:
<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>
如果我们尝试使用如下字符串文字调用 Print 方法:
<code class="cpp">Output::Print("Hello World");</code>
意外地,输出是“True”而不是“Hello World” ”。为什么?
在 C 中,像“Hello World”这样的字符串文字不是 std::string 类型,而是常量字符数组。但是,它们可以隐式转换为布尔值。这种转换称为标准转换序列,编译器优先于 std::string 的用户定义转换构造函数。
在重载解析期间,编译器确定为每个参数调用的最佳函数。标准转换序列优先于用户定义的转换。在我们的例子中,从“Hello World”到 bool 的标准转换被认为比用户定义的到 std::string 的转换更好。
确保 std使用 ::string 重载,我们需要显式传递 std::string 参数:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
这解决了歧义并正确输出“Hello World”。
理解隐式转换及其对重载解析的影响在 C 中至关重要。默认情况下,标准转换优先于用户定义的转换。因此,必须了解此类转换并在必要时进行显式类型转换以避免意外行为。
以上是为什么在重载的 C 打印方法中'Hello World”打印为'True”?的详细内容。更多信息请关注PHP中文网其他相关文章!