2013-07-16 33 views
3

a)X1和X2是否等於?如果不是,應該如何進行明確的重新解釋/常量轉換?是char ** x =(char **)arg等效於reinterpret_cast <char**>(const_cast <void*>(arg))?

void some_legacy_function(const void* arg) { 
    char** X1 = (char**) arg; 
    char** X2 = reinterpret_cast<char**>(const_cast<void*>(arg) ); 
    /* not surprisingly, indexing into X1 randomly crashes in release build */ 
} 

b)這個演員對我來說似乎很奇怪,在某些情況下它實際上是100%合法嗎?

回答

4

a)第一行相當於static_cast<char**>(const_cast<void*>(arg)),我相信。不是說它有什麼區別。

b)那麼,如果arg實際上指向char *的數組是合法的。如果一個reinterpret_cast是一個指向U *指針的T *指針(對於任意類型T和U,相關或其他)並返回T *,則保證返回原始值。所以是的,可以構建一個代碼在這個代碼中工作的例子。當然,這並不意味着功能設計得很好。

2

是的,他們基本上是相同的,除了C++風格的演員顯示代碼的讀者,你正在做一些奇怪的東西,而它很難注意到c風格。

它的合法但一如既往高度懷疑,當一個常量傳入參數被轉換爲非常量。

相關問題