[英]reinterpret_cast<int*>(char*) vs. static_cast<int*>(static_cast<void*>(char*)) — which to use?
[英]static_cast void* char* vs static_cast void** char**
如果我做以下一切都沒問題:
char* cp = "abc";
void* vp = NULL;
vp = static_cast<void*>(cp);//ok
cp = static_cast<char*>(vp);//ok
但以下不是:
char** cpp = &cp;
void** vpp = NULL;
vpp = static_cast<void**>(cpp);//error C2440: 'static_cast':
//cannot convert from 'char **' to 'void **'
cpp = static_cast<char**>(vpp);//error C2440: 'static_cast':
//cannot convert from 'void **' to 'char **'
請有人向我解釋為什么不允許第二個例子。 請不要引用C ++標准作為整個答案,因為我已經看到引用它的答案,我不明白它們的意思。 我想理解為什么第二個例子不起作用(即,如果你能給出一個例子,那將會是一個很大的幫助)。 因為我沒有得到它。 對我來說,這兩個例子都是鑄造指針。 為什么額外的間接級別會有所不同?
void *
指針可以指向“任何”,將所有指針轉換為void *
是有效的,將所有指針從void *
轉換為其他類型是有效的。
但是, void **
是指向void *
值的指針。 char **
是一個指向char *
值的指針。 這些類型不指向可相互轉換的類型。 如果您需要這樣做,可以使用void **vpp = reinterpret_cast<void **>(cpp);
,但它“不安全”(你基本上是在告訴編譯器“看,我知道我在這里做什么,所以就這么做”,這可能不會達到你的實際預期......)
限制是避免破壞類型系統。 第一次轉換很好:
type *p = ...;
void *vp = p;
當你放棄的類型,你不能造成太大的傷害到原來的值,而因為有一點要與做void
對象和所有變化vp
是本地指針並不能影響p
。
如果允許第二種情況:
type **p = ...;
void **vp = p;
那么完美的代碼和正確的代碼可能會破壞您的應用 例如:
int *parray[10];
int **p = parray;
void **vp = p;
*vp = new double(); // now parray[0] is a pointer to a double object,
// not a pointer to an int!!!
類型系統已被破壞。
也就是說,問題在於,在第二種情況下,存在可以應用於可以修改原始對象並導致錯誤的目標指針的操作。 類似的例子可以在const
其他情況下找到(你可以將int*
轉換為const int*
,但你不能將int**
轉換為const int**
...)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.