![](/img/trans.png)
[英]Why does this C-style cast not consider static_cast followed by const_cast?
[英]Does the C++ specification say how types are chosen in the static_cast/const_cast chain to be used in a C-style cast?
這個問題與我在嘗試回答這個關於C樣式轉換和類型轉換的有趣問題有關,我在C ++規范中注意到。
C ++規范在§5.4中討論了C樣式的強制轉換。 它表示強制轉換符號將按此順序嘗試以下強制轉換,直到找到有效的轉換為止:
const_cast
static_cast
static_cast
后跟const_cast
reinterpret_cast
reinterpret_cast
后跟const_cast
。 雖然我有意味着什么,使用一個偉大的直觀的想法static_cast
后跟一個const_cast
(例如,一個轉換const Derived*
一個Base*
通過一個持續const_cast<Base*>(static_cast<const Base*>(expr))
),我在規范中沒有看到任何措辭說明如何具體推導static_cast
/ const_cast
系列中使用的類型。 對於簡單的指針,這並不難,但是如鏈接的問題所示,如果在一個位置引入一個額外的const
並在另一個位置刪除了一個const
則轉換可能會成功。
是否有任何規則控制編譯器應如何確定在轉換鏈中使用哪種類型? 如果是這樣,它們在哪里? 如果不是,這是否是語言的缺陷,或者是否存在足夠的隱式規則來唯一確定所有可能的強制轉換?
如果不是,這是否是語言的缺陷,或者是否存在足夠的隱式規則來唯一確定所有可能的強制轉換?
如何僅使用const_cast
構造所有可以const_cast
為目標類型的類型,即所有“中間類型”呢?
給定目標類型T
,如果static_cast
不起作用,請確定可以添加cv限定詞的所有位置,以便由const_cast
1將結果類型const_cast
回T
繪制算法的:取CV-分解( [conv.qual] / 1 )的T
; 每個CV J的特征可以增強。 如果T
是參照,我們可以增加裁判類型的cv資格。
現在,將const volatile
添加到所有這些位置。 調用結果類型CT
。 嘗試static_cast
將該表達式改為CT
。 如果const_cast<T>(static_cast<CT>(
,我們的演員表鏈就是const_cast<T>(static_cast<CT>(
e ))
。
如果這不起作用,則很可能沒有使用static_cast
和const_cast
(我還沒有深入研究過載解析的深處(我有,但不是針對這個問題))。 但是我們可以使用蠻力反復刪除const
/ volatile
並檢查每種類型是否真正需要。 因此,從理論上講,沒有歧義或規格不足。 如果有鑄造鏈,就可以確定。 在實踐中,可以使該算法非常簡單,因為(可以肯定)我們可以從T
構造的“最具有cv資格”類型就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.