將物件作為錯誤型別訪問

在大多數情況下,訪問一種型別的物件是非法的,就好像它是一種不同的型別(忽略 cv 限定符)。例:

float x = 42;
int y = reinterpret_cast<int&>(x);

結果是未定義的行為。

嚴格別名規則有一些例外 :

  • 可以訪問類型別的物件,就好像它是一個型別是實際類型別的基類。
  • 任何型別都可以作為 charunsigned char 訪問,但反之則不然:無法訪問 char 陣列,就好像它是任意型別一樣。
  • 有符號整數型別可以作為相應的無符號型別訪問,反之亦然

一個相關的規則是,如果在一個實際上與函式的定義類或派生類沒有相同型別的物件上呼叫非靜態成員函式,則會發生未定義的行為。即使函式不訪問物件,也是如此。

struct Base {
};
struct Derived : Base {
    void f() {}
};
struct Unrelated {};
Unrelated u;
Derived& r1 = reinterpret_cast<Derived&>(u); // ok
r1.f();                                      // UB
Base b;
Derived& r2 = reinterpret_cast<Derived&>(b); // ok
r2.f();                                      // UB