首页 >后端开发 >C++ >为什么在重载的 C 打印方法中'Hello World”打印为'True”?

为什么在重载的 C 打印方法中'Hello World”打印为'True”?

Linda Hamilton
Linda Hamilton原创
2024-11-14 11:05:02258浏览

Why Does

重载方法中的字符串文字歧义

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn