[英]c++ static_cast and references
struct A{};
struct B : A{};
int main()
{
A a;
A& a_ref = a;
static_cast<B>(a); // *1
static_cast<B&>(a_ref); // *2
return 0;
}
(* 1)產生錯誤,我理解為什么。 (* 2)編譯好,但為什么? 並且,只要它編譯並假設B
包含一些屬性,如果我將a_ref
為B&
然后嘗試訪問屬性會怎么樣? 我想我會遇到運行時錯誤。
因此,正如我所看到的,有一種情況會導致崩潰,並且沒有辦法避免它,與dynamic_cast
不同,在dynamic_cast
,可以檢查轉換為null的結果或將代碼放在try-catch
區域中。 我如何處理這種情況,我需要投射參考,並確保我真正得到正確的參考。
從標准的n3337草案5.2.9 / 2
類型為“cv1 B”的左值,其中B是類類型,可以強制轉換為類型“引用cv2 D”,其中D是從B派生的類(第10條),如果是從“指針到”的有效標准轉換D“到”指向B的指針“存在(4.10),cv2與cv1相同,或者cv資格比cv1更高,並且B既不是D的虛基類,也不是虛基類的基類D.
在你的情況下:
B
是從A
派生的類,都是非const的,允許從A*
到B*
轉換, A
不是D
虛基類。
static_cast<>
只會檢查類型是否兼容
如果1種類型不直接兼容,因為re不是操作者來描述A和B之間的復制關系
在情況2中,強制轉換是一個參考強制轉換,就編譯器而言, A*
可以被轉換為B*
因為它們是兼容的。 編譯器不會知道指針a_ref
,這就是它允許你使用它的原因。 dynamic_cast<>
檢查指針指向的類。
這是我使用boost::polymorphic_downcast
( doc )的原因之一 - 在調試中它使用dynamic_cast
后跟assert,在發布中它是static_cast
,因此沒有性能損失。
(* 2)編譯好,但為什么?
一般情況下,您無法靜態檢查動態類型; 和static_cast
不進行任何動態類型檢查。 它允許可能根據靜態類型,包括根據動態類型不是有效轉換是有效的任何轉換。
如果我將a_ref轉換為B&然后嘗試訪問屬性怎么辦?
未定義的行為。 如果您使用static_cast
,則有責任確保轉換有效。
我如何處理這種情況,我需要投射參考,並確保我真正得到正確的參考。
對於多態類型,請使用dynamic_cast
。 應用於引用,如果轉換無效,它將拋出std::bad_cast
。
對於非多態類型,您可以自己動手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.