簡體   English   中英

那是什么意思reinterpret_cast <char *&> (a)= cp;

[英]what is that mean reinterpret_cast<char *&>(a) = cp;

是的,這不是很可移植,我想知道為什么要做這樣的事情:

char *cp ;
reinterpret_cast<char *&>(a) = cp;

`是什么意思?

謝謝

a被強制轉換為char*& 之所以稱為reinterpret_cast ,是因為這些位將按照轉換目標類型所要求的方式完全重新解釋。 編譯器不會檢查有效性(他也不會)。 這將指針帶回其起源:它只是一塊內存的地址。

a強制轉換為對指針的引用的原因是,引用需要具有有效的lvalue才能將cp分配給該引用。 reinterpret_cast<char *>(a) = cp是非法的,因為您不能分配給臨時對象。

在源代碼中看起來有點難看。 這個:

char* c = reinterpret_cast<char*>(a);
c = cp;

可能是更好的維護和讀,雖然它不再(注意這是不完全一樣的意義,因為我們推出了一個額外的變量c舉行投的結果。在原來的樣品, a的記憶被重新指向新位置cp )。

有些人對演員表中的參考感到困惑。 沒有參考,我們將有這樣的事情:

T a; // whatever a is, we don't know
char* cp; // or something convertible to char*

// remember, this is not what actually gets generated
char* some_temporary_rvalue = reinterpret_cast<char*>(a);
some_temporary_rvalue = cp; // illegal, and senseless

通過引用,它變為:

T a; // whatever a is, we don't know
char* cp; // or something convertible to char*

char*& a_treated_as_charptr = reinterpret_cast<char*&>(a);
a_treated_as_charptr = cp; // assigns a char* that is at &a

有趣的部分,從這個問題是缺少的類型a 我可以假設它是某種指針(實際上可以是任何指針,但是這種假設使討論更加簡單)。

T *a;
char* p = "Hello";
reinterpret_cast<char*&>(a) = p;

假設a實際上是指向另一種類型的指針,則該操作的結果將等效於:

T *a;
char *p = "Hello";
a = reinterpret_cast<T*>(p); // convert p to a T* and assign

區別在於,在第一個版本中,強制轉換是在分配的左側(LHS)執行的,因此必須強制轉換為參考(左值),而在第二種情況下,強制轉換是在右側執行的右手邊(RHS),因此右值就足夠了,不需要強制引用。

現在,在一般情況下,兩個演員陣容有所不同。 重新解釋類型轉換將只是“重新解釋”您所告知類型的內存。 如果achar*的類型具有相同的大小(在上述假設下,所有指針的大小都相同),則兩個操作相同,並且產生相同的結果。

另一方面,如果一個類型大於另一個類型,則這兩個操作是不相等的。 如果sizeof(a) > sizeof(char*)的第一個版本將重新解釋變量,並覆蓋僅第一sizeof(char*)的字節a與值p 在第二種情況下它將讀取sizeof(a)從所述存儲器位置字節p (導致未定義的行為,因為它會讀取超出變量)和復制在overwritting所有先前字節那些字節a

相反,如果去sizeof(a) < sizeof(char*)則第一版本將覆蓋超出了所分配的空間a導致未定義的行為,而第二個將覆蓋a與所述第一sizeof(a)以字節為單位p

暫無
暫無

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

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