[英]Char, unsigned char and signed char as char&
有人可以解釋一下,為什么我不能通過unsigned char a = 'g'
和signed char b = 'g'
到void f(char&){}
,但我可以將char c = 'g'
傳遞給它?
據我在谷歌搜索三十分鍾后了解到,這可能是由類型轉換引起的(不確定)。
但是,如果它們具有相同的值范圍(當然,如果類型轉換有問題),那么從signed char
轉換為char
會有什么問題。
他們是不同的類型。
它們具有相同的數值范圍並不重要。
您不能OneThing
的引用綁定到SomeOtherThing
。
這正是類型系統的目的:在您的程序中進行約束,這樣您就不會出錯。
選項:
void f(const char&)
對const
的引用是特殊的。 當您在此處傳遞signed char
時,它會自動轉換為臨時char
。 臨時對象可以綁定到const
引用。 但是,如果您無法更改原始值,這樣做的目的是什么? 還不如按值傳遞。
void f(char)
這是按值傳遞。 現在任何可以隱式轉換為char
的東西(例如signed char
)都將被接受,盡管原始值將不再在f
中“連接”。 此外,您需要注意數字范圍是否匹配:如果傳遞一個unsigned char
可能不是這種情況。
類型雙關語
您的調用 scope 可以執行f(reinterpret_cast<char&>(mySignedChar))
並且它會起作用,因為以這種方式對char
進行別名/雙關語有特殊規則。 然而,這是一種 hack,並且(與普遍的看法相反)對於大多數其他類型是不合法的。
使您的類型一致
這就是語言想要你做的。 為什么你有一個 function 帶char
,但一個 function 傳遞signed char
? 為什么你的類型不匹配? 如果這超出了您的控制范圍(例如,來自不同第三方庫的不同習語),那么如果確實有必要,您可以使用類型雙關語,盡管這應該是最后的手段。
為什么我不能將 unsigned char a = 'g' 和 signed char b = 'g' 傳遞給 void f(char&){}
因為unsigned char
、 signed char
和char
是不同的類型。 並且因為引用不能綁定到錯誤類型的 object。 即使是具有相同寬度的 integer 類型的有符號或無符號變體(字符類型為 integer 類型)。 這個限制是語言中強類型的一個方面,它可以防止程序員通過錯誤地傳遞錯誤類型的對象而犯錯誤。
然而,無符號/有符號的變體可以隱式地相互轉換。 但是轉換的結果是一個右值,非常量左值引用不能綁定到右值。 一個 const 左值引用可以綁定到一個右值。 在這種情況下,轉換臨時結果的生命周期會延長以匹配引用的生命周期。
如果它們具有相同的值范圍,則將帶符號的 char 轉換為 char
signed char
和char
不一定在所有系統上具有相同的值范圍。 與其他 integer 類型(其中int
與signed int
類型相同)不同, char
與signed char
和unsigned char
不同,並且可能是有符號或無符號的,具體取決於系統。
但我可以將 char c = 'g' 傳遞給它嗎?
這是因為對T
類型的引用可以綁定到T
類型的 object 。
沒有對左值引用的強制轉換。 這是你嘗試的。
然而,有轉換為 const 左值引用,所以如果你嘗試調用:
void f(const char& c) {}
使用有signed char
和unsigned char
它應該可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.