首頁 >後端開發 >C++ >為什麼 C 在隱式型別轉換期間只允許一種使用者定義的轉換?

為什麼 C 在隱式型別轉換期間只允許一種使用者定義的轉換?

Patricia Arquette
Patricia Arquette原創
2024-11-01 01:14:28616瀏覽

Why Does C   Allow Only One User-Defined Conversion During Implicit Type Conversions?

C 隱式轉換:了解使用者定義的轉換規則

根據最近對先前回覆的回饋,有必要澄清一下理解C 中的隱式轉換。

考慮以下程式碼片段:

<code class="c++">#include <string>

struct A {
    A(const std::string &s) {}
};

void func(const A &a) {
}

int main() {
    func("one"); // error
    func(A("two")); // ok
    func(std::string("three")); // ok
}</code>

第一個函數呼叫會導致錯誤,因為沒有從 const char* 到 A 的直接轉換。雖然存在從字串到 A 的轉換,但應用它需要多次轉換,這是不允許的。

C 標準(SC22-N-4411.pdf)在第12.3.4 節中提供了答案titled 'Conversions':

"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."

這意味著在隱式類型轉換或初始化期間,只能將一個隱式使用者定義轉換(建構函數或轉換函數)套用於單一值。

在給定的程式碼中,第一個函數呼叫func("one") 嘗試使用從const char* "one" 到A 的隱式轉換,但它失敗了,因為這需要兩次轉換(一次來自const char * 到std::string,另一個從std::string 到A)。另外兩個函數呼叫是有效的,因為它們每個只涉及一次隱式轉換。

以上是為什麼 C 在隱式型別轉換期間只允許一種使用者定義的轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn