2014-02-22 28 views
6

我正在寫一門課,假設Are enumeration types layout compatible with their underlying type?的答案爲「是」,但版式兼容struct kevent,但使用enum classES爲filter,flags等與相關字段的適當底層類型。它也是標準佈局(所有字段都是private,它們都是標準佈局,沒有virtual成員,沒有基類)。從我讀到的n3690中,我可以確定我的班級和struct kevent具有相同的值表示形式,但是我看不到標準中的任何內容,因此我可以在它們之間使用reinterpret_cast,儘管這似乎是對「價值」的合理解釋表示」。標準在技術上允許嗎?如果不是,知道某種類型的價值表示會給你什麼?我可以在佈局兼容的標準佈局類型之間合法reinterpret_cast嗎?

編輯2014年2月24日16:45 EST:針對一個評論,我要澄清,我想第一類reinterpret_cast參考第二,當然你可以不直接reinterpret_cast一個非指針類型到另一個非指針類型。

+1

[class.mem]/18允許通過聯合進行某些類型的雙擊,[class.mem]/19允許通過reinterpret_cast訪問* first *數據成員。但我不確定是否還有更多。 – dyp

+1

你不能在結構類型之間「reinterpret_cast」,你是指在指向這些類型的指針之間進行轉換,並通過指向另一個類型的指針讀取一個指針? –

+0

如果你可以從'指向A'的'reinterpret_cast'到'指向B'的指針,你可以''把'''reinterpret_cast'從'A'重新引用到'引用B'。我會更新這個問題,明確提及'reference to'位。 –

回答

5

但我看不到標準中的任何內容,因此允許我在它們之間輸入reinterpret_cast,即使這看起來像是對「價值表示」的合理解釋。標準在技術上允許嗎?

編號標準很清楚(請參閱[basic.lval] p10)關於哪些類型可以是別名,並且不包括與佈局兼容的類型。

如果不是,那麼知道某個類型的值表示會給你什麼?

如果類型都能夠複製平凡和具有相同的值表示,那麼你可以從一個類型的對象memcpy的於其他類型的對象,反之亦然。如果它們不是可以複製的,那麼它根本就不會給你太多。

AFAICT標準實際上並沒有說什麼可以和不可以用佈局兼容類型來完成。