簡體   English   中英

c ++ static_cast和引用

[英]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_refB&然后嘗試訪問屬性會怎么樣? 我想我會遇到運行時錯誤。

因此,正如我所看到的,有一種情況會導致崩潰,並且沒有辦法避免它,與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_downcastdoc )的原因之一 - 在調試中它使用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.

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