在C++中,c-casting與類型或參考類型有什麼區別?c-casting類型與c-casting類型的參考
foo = (unsigned int) whatever;
// Is this the same as:
foo = (unsigned int&) whatever;
在C++中,c-casting與類型或參考類型有什麼區別?c-casting類型與c-casting類型的參考
foo = (unsigned int) whatever;
// Is this the same as:
foo = (unsigned int&) whatever;
不,它甚至不是相同的。
(在某些情況下,投的確切性質取決於什麼whatever
是。我假設的whatever
類型無關unsigned int
。)
C-鑄造引用類型unsigned int &
相當於執行reinterpret_cast
於該類型
foo = reinterpret_cast<unsigned int &>(whatever);
其是由定義相當於
foo = *reinterpret_cast<unsigned int *>(&whatever);
whatever
在這種情況下必須是左值。
換句話說,鑄造參考只是類型雙關的另一種方法。你很簡單重新解釋whatever
佔用的內存作爲一個unsigned int
對象。一般情況下,行爲是不確定的。例如,如果sizeof whatever
小於unsigned int
的大小,重新解釋還將涉及一些甚至不屬於whatever
的「狂野」內存。
同時,非參考C-cast只是一個值轉換,而不是內存重新解釋。對於算術轉換爲unsigned int
,它相當於static_cast
(但如果whatever
是指針,則相當於reinterpret_cast
)。它讀取的值的whatever
並根據語言轉換規則(如果存在轉換)將其轉換爲unsigned int
類型。
例如,這
float f = 5;
unsigned int i = (unsigned int) f;
將值的f
轉換成鍵入unsigned int
,這意味着i
將接收值5
。同時,如果你的平臺上尺寸unsigned int
和float
具有相同的大小,那麼這個
unsigned int i = (unsigned int &) f;
會與實際價值5
作爲unsigned int
類型的對象重新詮釋float
對象f
的內部對象表示。 i
的結果值通常是不可預知的。通常它不會接近5
(在流行的實現中,您將僅收到i
中原始float
值的IEE754表示)。
如果在源類型和目標類型之間存在繼承關係,則Nitpick,轉換爲引用也可以是靜態轉換。在一些具有多重繼承的場景中,這實際上很重要,因爲'reinterpret_cast'將提供一個指向源對象開始的指針,但'static_cast'會糾正指針以引用目標對象的開始。 (無論如何,因爲問題是關於'unsigned int') –
@DavidRodríguez - dribeas:是的,謝謝。爲了避免將答案與細節重載,我假定我們正在專門討論將其轉換爲'unsigned int'。 – AnT
reinterpret_cat iz在你的天花板,看着你轉換你的vrblz –
這些是不同的問題,我確信這兩個問題之前已經被問及過很多次。儘管如此,避免「重複」票選的好辦法。你願意爲每個問題提出一個問題嗎? –
2不是靜態鑄造。這是C型鑄造。改用'static_cast'。 –
沒有任何保證(在C++中)所有枚舉都適合於一個無符號整數。在你的例子中,它會。 –