2013-02-17 113 views
6

我不確定它是否早已被問過,但一定是我相信的。考慮簡單的線的問題開始:static_cast如何將一個int轉換爲char而不是reinterpret_cast?

int a ; 
char b = reinterpret_cast<char> (a); 

我明白reinterpret_cast解釋X型的位模式爲鍵入y,ofcouse它不應該工作,由於大小不匹配,實際上並非如此。

現在考慮這個另一個代碼:

int a ; 
char b = static_cast<char> (a); 

這工作! 。現在我的問題是它如何工作?我的意思是編譯器切掉了這些位? 。我確定sizeof(char) < sizeof(int)。如果那樣,reinterpret_cast也應該使用相同的技術?

回答

6

有一個明確的從intchar的轉換;這就是static_cast所做的。事實上,你不需要演員;你可以在這裏使用一個任務。另一方面,reinterpret_cast表示假設一種類型的對象中的位代表另一種類型的對象;對於某些類型沒問題(或多或少),但沒有明智的方法來假裝int中的位可以用作字符中的位而不應用轉換,並且reinterpret_cast不會這樣做。

+0

*「... and'reinterpret_cast' does not that」*。該規範的哪一部分說明了這一點? – Nawaz 2013-02-17 17:56:01

+4

@Nawaz,明確地定義'reinterpret_cast'允許的轉換的部分,你期望它在哪裏說出來? [expr.reinterpret.cast]「可以使用'reinterpret_cast'明確執行的轉換如下所示:**否 其他轉換可以使用'reinterpret_cast'明確執行**」 – 2013-02-17 18:00:50

+0

儘管名稱看似廣泛, reinterpret_cast'是相當有限的。正如@JonathanWakely所指出的那樣,它可以做的事情列表(基本上涉及指針和引用的事情),並且不允許任何其他事情。 5.2.10 [expr.reinterpret.cast]。完全不像C風格演員...... – 2013-02-17 22:36:29

3

static_cast既可以強制定義的轉換髮生,也可以反轉定義的轉換(除了添加或刪除const/volatile外)。你認爲reinterpret_cast是一些可以做任何事情的超級演員。事實並非如此。它有一組定義的轉換。

它可以將一種類型的指針轉​​換爲另一種指針(只要const/volatile被保留)。它可以類似的做參考。它可以將指針指向整型,反之亦然。

除此之外,它不會做任何事情,您的程序也不是格式良好的。