[英]static_cast throws error but C-style cast works
當我使用static_cast
:
const C* cObj; // C is a user-defined class
void* obj = static_cast<void*>(cObj);
我得到錯誤:
轉換失去資格
但是,當我使用C樣式轉換時,它可以工作:
const C* cObj;
void* obj = (void*)cObj;
為什么會這樣呢?
通過C ++樣式強制轉換的正確方法是什么?
為什么會這樣呢?
C樣式強制轉換有效,因為它具有多個C ++強制轉換的功能。 例如,它可以消除常量性,並同時重新解釋指針類型。 由C ++編譯器所使用的過程來決定如何解釋特別是C鑄描述這里 。
強制轉換常量指針的C ++方法是將其強制轉換為另一個常量指針,如下所示:
const void* obj = static_cast<const void*>(cObj);
如果還需要消除常量性,則可以像這樣鏈接演員表:
void* obj = const_cast<void*>(static_cast<const void*>(cObj));
const_cast
常規預防措施與往常一樣適用:如果要投射的指針指向一個常量對象,則在投射導致未定義行為后,通過非const指針修改該對象。
如果毀滅之路確實是您的意圖...
struct C;
template<class T>
T* daringly_remove_const_and_damn_the_consequences(T const* p)
{
return const_cast<T*>(p);
}
const C* cObj; // C is a user-defined class
void* obj = static_cast<void*>(daringly_remove_const_and_damn_the_consequences(cObj));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.