簡體   English   中英

C ++規范是否說明了如何在static_cast / const_cast鏈中選擇類型以用於C風格的轉換?

[英]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_castT 繪制算法的:取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_castconst_cast (我還沒有深入研究過載解析的深處(我有,但不是針對這個問題))。 但是我們可以使用蠻力反復刪除const / volatile並檢查每種類型是否真正需要。 因此,從理論上講,沒有歧義或規格不足。 如果有鑄造鏈,就可以確定。 在實踐中,可以使該算法非常簡單,因為(可以肯定)我們可以從T構造的“最具有cv資格”類型就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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