簡體   English   中英

static_cast void * char * vs static_cast void ** char **

[英]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.

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