2016-09-22 61 views
1

我知道reinterpret_cast主要用於去往或來自char*爲什麼我可以使用static_cast With void *但不能使用char *

但我很驚訝地發現static_cast可以做到與void*相同。例如:

auto foo "hello world"s; 
auto temp = static_cast<void*>(&foo); 
auto bar = static_cast<string*>(temp); 

我們使用reinterpret_castchar*static_castvoid*收穫了什麼?這與嚴格的別名問題有關嗎?

+1

通常情況下,你投到一個'char *'做一些單獨的字節。你不能用'void *'來做到這一點。 – NathanOliver

+0

@NathanOliver所以你說的就像'memcpy'或類似的東西? –

+1

'memcpy'就是其中之一。流的'read'和''wrtie'功能是其他功能。如果你需要通過com數據發送東西,你也可以這樣做。 – NathanOliver

回答

0

你的問題實際上有兩個部分:

  1. 我應該使用static_castreinterpret_cast而不對象類型的關注與一個指向對象的基礎位模式工作?
  2. 如果我應該使用reinterpret_castvoid*char*最好能解決這個潛在的位模式?

static_cast:使用隱式和用戶定義的轉換

在5.2.9 [expr.static.cast] 13的標準的組合類型之間轉換,實際上,給出的例子:

T* p1 = new T; 
const T* p2 = static_cast<const T*>(static_cast<void*>(p1)); 

它利用了隱式轉換:

可將指向任何(可選cv限定)對象類型T的prvalue指針轉換爲指向(相同cv限定)void的prvalue指針。結果指針表示與原始指針值相同的內存位置。如果原始指針是空指針值,則結果是目標類型的空指針值。 *

然而,有從T類型的指針沒有隱式轉換爲一個char*。所以完成演員表的唯一方法是使用reinterpret_cast

reinterpret_cast:由當你施放到void*char*你正在尋找與合作在回答

所以重新詮釋底層位模式,以你的問題的一部分類型之間的轉換底層位模式,reinterpret_cast應該被使用,因爲它的用途表示讀者轉換到/從底層位模式。

下面我們來比較void*char*。這兩者之間的決定可能會更多地依賴於應用程序。如果你要使用標準庫函數與潛在的位模式只需使用類型函數接受:

  • void*cstring
  • readwrite使用char*所提供的mem功能使用輸入

值得注意的是,C++特定庫更喜歡char*指向內存。 保持內存爲void*似乎因爲兼容性原因被保留爲指針here。因此,如果cstring庫函數不會用於您的底層位模板,請使用C++特定庫行爲來回答您的問題的部分:首選char*void*

0

一般來說,static_cast將會投出任何兩種類型,如果其中一種可以隱式投射到其他。其中包括數學演員陣容,演員陣容,演員陣容和演員陣容,並可從void*轉換。

也就是說,如果這個轉換是有效的:

void foo(A a); 
B b; 
foo(b); 

然後兩個static_cast<B>(a)static_cast<A>(b)也將是有效的。

由於任何指針都可以隱含地投射到void*,因此您的特有行爲。

reinterpret_cast通過重新解釋值的位模式進行投射。就像你在問題中所說的那樣,通常是爲了在不相關的指針類型之間進行轉換而完成的。

是的,你可以不相關的指針類型之間通過void*轉換,通過使用兩個static_cast

B *b; 
A *a1 = static_cast<A*>(b); //compiler error 
A *a2 = static_cast<A*>(static_cast<void*>(b)); //it works (evil laugh)! 

但這是彎曲的規則。如果你真的需要這個,只需使用reinterpret_cast

相關問題