![](/img/trans.png)
[英]How can I convert const std::vector<unsigned char> to char
[英]Why can I implicitly convert char* to const char* but not unsigned char*
以下代碼片段會產生編譯錯誤:
char a = 'a';
const char* a_ = &a;
unsigned char b = 'b';
const char* b_ = &b;
最后一行產生錯誤:
error: invalid conversion from 'unsigned char*' to 'const char*'
我可以從char*
隱式轉換為const char*
,但我不能對unsigned char*
做同樣的事情? 這背后的原因是什么?
您可以向指針對象添加常量性。 這是允許的,因為它有用且安全。
但是你不能只是隨機地改變指針的類型。
你是說“我有一個指向char
的指針,嘿,在這里,哎呀,它是一個unsigned char
”,如果沒有 C 風格的“強制”強制轉換或reinterpret_cast
,你就無法做到這一點。
這是正確的代碼:
char a = 'a';
const char* a_ = &a;
unsigned char b = 'b';
const unsigned char* b_ = &b; // (added "unsigned" here)
因為當你將一個值存儲到一個有signed char x;
然后通過有signed char *xp = &x;
獲取它 (通過*xp
)或有signed char const *xcp =&x;
,你得到相同的值。 總是。
但是如果你已經signed char x = -1;
然后你通過一個unsigned char*
指針獲取它,你會得到一個不同的值(255,除非是異國架構)。
這就是為什么可以將INT *ip
分配給INT const *
而不能分配給UINT *
(其中INT
和UINT
是任何有符號整數類型及其無符號對應物)。
嚴格的別名規則仍然允許您通過UINT
指針訪問INT
值,反之亦然,但您需要顯式轉換才能獲得這樣的指針(指向原始類型的不同簽名版本)。
注意: char
具有未指定的符號。 它要么等signed char
或類似的unsigned char
,但它是一種從兩者的這些不同(不同於所有其他整數類型,其中signed INT
是相同的INT
(在位域除外))。
指向非常量對象的指針可以隱式轉換為指向相同類型的常量對象的指針。 所以這些聲明
char a = 'a';
const char* a_ = &a;
是有效的。
現在讓我們考慮以下聲明(為清楚起見,移除了限定符const
)
unsigned char b = 'b';
char* b_ = &b;
右側的表達式具有unsigned char *
類型,而初始化對象具有char *
類型。 這兩種類型是不同的,並且沒有從一種類型到另一種類型的隱式轉換。 相反,你可以寫
unsigned char b = 'b';
char* b_ = reinterpret_cast<char *>( &b );
在這種情況下,右側和左側的兩個實體具有相同的類型。 因此,您現在可以為聲明的對象的規范添加限定符 const
unsigned char b = 'b';
const char* b_ = reinterpret_cast<char *>( &b );
在 C 和 C++ 中, char
、 signed char
和unsigned char
類型是三種不同的類型。 類型char
可以表現為有signed char
類型或unsigned char
類型(可以具有相同的值范圍),但這不會使其成為有符號或無符號字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.