首頁  >  文章  >  後端開發  >  為什麼字串文字在 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