C++ static_cast和implicit_cast

問題來源:

此問題來源於muduo庫代碼的學習過程中,在muduo/base/Types.h文件中的第62行,如圖:
在這裏插入圖片描述

後續代碼:
在這裏插入圖片描述

這段話是說,使用implicit_cast作爲static_castconst_cast的安全版本。

看到第112行,我有了一個疑惑:
static_cast也會進行類型檢查,爲什麼要自定義一個隱式轉換,而不是直接使用static_cast呢?
這段註釋說implicit_caststatic_cast安全,更安全體現在哪裏呢?

解決

還是試一下吧,有如下的測試代碼:

template<typename To, typename From>
inline To implicit_cast(From const &f)
{
  return f;
}

class A {};

class B : public A {};

class C {};

int main() {

    A a;
    A* p1 = &a;

    B b;
    B* p2 = &b;

    A* p3 = &b;

    //基類指針轉子類指針
    implicit_cast<B*>(p1);//不通過
    static_cast<B*>(p1);//通過

    //子類指針轉基類指針
    implicit_cast<A*>(p2);//通過
    static_cast<A*>(p2);//通過

    //指向子類對象的基類指針轉子類指針
    implicit_cast<B*>(p3);//不通過
    static_cast<B*>(p3);//通過

    //不相干類型的指針轉換
    implicit_cast<C*>(p1);//不通過
    static_cast<C*>(p1);//不通過

    //試圖去除底層const屬性
    const B* p4 = &b;
    implicit_cast<A*>(p4);//不通過
    static_cast<A*>(p4);//不通過

    return 0;
}

總結

從編譯結果可以看出,二者都會進行類型檢查,禁止不相關的類型轉換以及試圖去除const的轉換。
static_cast允許向上、向下轉型,而implicit_cast只允許向下轉型。

所以說在這種情況下,使用implicit_cast更合適。

儘管有時候想要用指向子類對象的基類指針向下轉型,但static_castimplicit_cast都只判斷其靜態類型,如果有這個需求,那就使用把static_cast包裝後的down_cast

爲什麼不使用dynamic_cast?1. 有額外開銷;2. 儘量用static_cast作爲替代。由於多繼承的存在,有些情況無法避免使用dynamic_cast。

2020/04/02 19:46
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章