簡體   English   中英

Char, unsigned char 和signed char as char&

[英]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

這正是類型系統的目的:在您的程序中進行約束,這樣您就不會出錯。

選項:

  1. void f(const char&)

    const的引用是特殊的。 當您在此處傳遞signed char時,它會自動轉換為臨時char 臨時對象可以綁定到const引用。 但是,如果您無法更改原始值,這樣做的目的是什么? 還不如按值傳遞。

  2. void f(char)

    這是按值傳遞。 現在任何可以隱式轉換為char的東西(例如signed char )都將被接受,盡管原始值將不再在f中“連接”。 此外,您需要注意數字范圍是否匹配:如果傳遞一個unsigned char可能不是這種情況。

  3. 類型雙關語

    您的調用 scope 可以執行f(reinterpret_cast<char&>(mySignedChar))並且它會起作用,因為以這種方式對char進行別名/雙關語有特殊規則。 然而,這是一種 hack,並且(與普遍的看法相反)對於大多數其他類型是合法的。

  4. 使您的類型一致

    這就是語言想要你做的。 為什么你有一個 function 帶char ,但一個 function 傳遞signed char 為什么你的類型不匹配? 如果這超出了您的控制范圍(例如,來自不同第三方庫的不同習語),那么如果確實有必要,您可以使用類型雙關語,盡管這應該是最后的手段。

為什么我不能將 unsigned char a = 'g' 和 signed char b = 'g' 傳遞給 void f(char&){}

因為unsigned charsigned charchar是不同的類型。 並且因為引用不能綁定到錯誤類型的 object。 即使是具有相同寬度的 integer 類型的有符號或無符號變體(字符類型為 integer 類型)。 這個限制是語言中強類型的一個方面,它可以防止程序員通過錯誤地傳遞錯誤類型的對象而犯錯誤。

然而,無符號/有符號的變體可以隱式地相互轉換。 但是轉換的結果是一個右值,非常量左值引用不能綁定到右值。 一個 const 左值引用可以綁定到一個右值。 在這種情況下,轉換臨時結果的生命周期會延長以匹配引用的生命周期。

如果它們具有相同的值范圍,則將帶符號的 char 轉換為 char

signed charchar不一定在所有系統上具有相同的值范圍。 與其他 integer 類型(其中intsigned int類型相同)不同, charsigned charunsigned char不同,並且可能是有符號或無符號的,具體取決於系統。

但我可以將 char c = 'g' 傳遞給它嗎?

這是因為對T類型的引用可以綁定到T類型的 object 。

沒有對左值引用的強制轉換。 這是你嘗試的。

然而,有轉換為 const 左值引用,所以如果你嘗試調用:

void f(const char& c) {}

使用有signed charunsigned char它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM