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中文網其他相關文章!