首页  >  文章  >  后端开发  >  为什么字符串文字在 C 中调用 `bool` 重载而不是 `std::string` 重载?

为什么字符串文字在 C 中调用 `bool` 重载而不是 `std::string` 重载?

Patricia Arquette
Patricia Arquette原创
2024-11-04 10:12:01788浏览

Why does a string literal call a `bool` overload instead of a `std::string` overload in C  ?

C 中的字符串文字和 Bool 重载解析

在 C 中,重载方法允许您定义多个具有相同名称但不同参数的方法类型。然而,找到要执行的确切重载有时似乎是出乎意料的。让我们探讨为什么在某些情况下字符串文字会匹配 bool 重载而不是 std::string 重载。

考虑以下代码:

<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;
    }
};

Output::Print("Hello World");</code>

当我们调用 Output::Print 时“Hello World”,我们可能期望它打印字符串文字。然而,令人惊讶的是,它打印了 True。发生这种情况是因为在后台发生了隐式转换。

在 C 中,像“Hello World”这样的字符串文字具有“12 个 const 字符的数组”类型。它们可以隐式转换为“指向 const char 的指针”,而该指针又可以隐式转换为 bool。此标准转换序列优于将字符串文字转换为 std::string 的用户定义转换序列。

根据 C 标准 (13.3.3.2/2),标准转换序列给出的更高在重载解析期间优先于用户定义的转换序列。由于从字符串文字到 bool 的转换是标准转换,因此它优先于 std::string 转换并选择 Print(bool) 重载。

以确保 std::string 重载被调用,显式提供一个 std::string 值:

<code class="cpp">Output::Print(std::string("Hello World"));</code>

理解这些隐式转换和重载解析规则对于 C 中避免混淆并确保执行预期的重载至关重要。

以上是为什么字符串文字在 C 中调用 `bool` 重载而不是 `std::string` 重载?的详细内容。更多信息请关注PHP中文网其他相关文章!

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