[英]Why would I use dynamic_cast to cast TO a void *?
所以我正在閱讀來自 "void *" 的 dynamic_cast的答案,雖然你不能從void *
轉換為T *
一些響應指出可以將T *
轉換為void *
,但不要沒有任何跡象表明你為什么要這樣做。
這只是可能的一些瑣事,還是有可能有意義? 我考慮過可能是為了可讀性或明確表示我們正在轉換為void *
,但考慮到dynamic_cast
的目的,它不太適合我。
就此而言,除了讓T *
void *
隱式變為void *
之外,還有什么理由可以做任何事情嗎? 我已經看到 C 風格的轉換為void *
不時用於這個目的,我認為只是明確的(假設我們沒有做一些不尋常的事情,比如將int
轉換為指針或其他東西)。
首先,當使用dynamic_cast<void*>(x)
您會得到一個指向最派生對象的第一個字節的指針。 只要x
的靜態類型是多態的。
這在少數場景中很有用,其中地址用作對象標識:
當然,這當然不是日常使用,但在 C++ 中,內存地址是對象的事實上的標識符,因此從繼承層次結構的任何部分訪問它的機制對於那些少數極端情況肯定是有用的。
這是有目的的,有點。 在允許它的規范部分中暗示了它。 來自 N3337,第 5.2.7 節,第 7 段:
如果 T 是“指向 cv void 的指針”,則結果是指向 v 指向的最派生對象的指針。
所以dynamic_cast<void*>(...)
實際上是static_cast<void*>(dynamic_cast<MostDerivedType*>(...))
簡寫。 這將是有用的......有點。
使其有用的困難在於您不一定知道MostDerivedType
是什么。 畢竟,每個表達式都可能不同。 因此,一旦將其作為void*
,您就不一定有辦法安全地將其恢復。 如果您對MostDerivedType
進行猜測並且只是static_cast
它,並且您錯了,那么您就處於未定義的行為領域。 而如果您對該類型執行dynamic_cast
(然后static_cast
為void*
),如果它不是該類型,它至少會返回 NULL 。
所以不,我會說它不是很有用。 如果您想生活在 C++ 的邊界內並且不依賴於潛在的未定義行為,則不是。
它在為運算符new和delete實現包裝器時很有用。 問題是操作符delete允許我們使用指向多態對象基址的指針來釋放內存。 在這種情況下,包裝器不知道哪個對象真正在那里被釋放(在包裝器之前分配的所有對象中)。 所以我們使用dynamic_cast< void * >()作為對象的唯一標識 - 它轉換為多態對象的最派生類型。 這允許我們跟蹤當前通過此包裝器分配的所有對象。 這種包裝器可用於內存分配跟蹤和批量釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.