我期待通過n3690
,即將到來的C++14
標準的草案,我在第7.2
款9
看到:枚舉類型佈局是否與其基礎類型兼容?
兩個枚舉類型是佈局兼容,如果他們有相同的基本類型。
但是,我找不到任何說枚舉類型與其基礎類型佈局兼容的東西。對我來說,看起來很明顯,這應該遵循給定「基礎類型」意味着什麼的合理語義,但它實際上是由標準保證的嗎?
我期待通過n3690
,即將到來的C++14
標準的草案,我在第7.2
款9
看到:枚舉類型佈局是否與其基礎類型兼容?
兩個枚舉類型是佈局兼容,如果他們有相同的基本類型。
但是,我找不到任何說枚舉類型與其基礎類型佈局兼容的東西。對我來說,看起來很明顯,這應該遵循給定「基礎類型」意味着什麼的合理語義,但它實際上是由標準保證的嗎?
不,沒有指定此標準的黑體字引用。一個可以得到最接近的是同一段
7點7 [...]的基礎類型是可以代表所有 枚舉值代網絡枚舉定義整型。如果沒有整數類型 可以表示所有枚舉值,則枚舉爲 不合格。 [...]
此外,4.5積分優惠[conv.prom]表示
4無作用域枚舉類型,其基礎類型是 固定成本(7.2)的prvalue可以被轉換爲一個其基礎類型的價值。
如在評論中指出,有可能是具有一個枚舉和其底層類型之間是不同的字節序(迂迴IMO)的實施方式。這將是一個執行質量問題。出於所有實際目的,應該預期佈局兼容性。
這保證了你可以在兩者之間調用'static_cast',但是AFAIK並不意味着嚴格意義上的佈局兼容性(例如按照穿過聯合的類型竄改)。 – dyp
@dyp [conv.prom]/4有更直接的引用。 – TemplateRex
也許我只是偏執狂,但我認爲*可轉換性*和/或有效範圍的平等對於某些具有'-fstrict-aliasing'的gcc來說不夠*。例如。如果對於某些實現,'short'與'int'具有相同的大小,這不會使它們(自動)在佈局兼容的意義上是'union {short s; int i; }你; u.s = 42; cout << u.i;' – dyp
在C中,這是有保證的,C++需要支持與C代碼混合,除非C++使用與C相同的表示法,否則C++需要支持。我希望看到更直接的答案,但是,尤其是這樣並沒有真正捕捉到佈局兼容性的所有方面。 – hvd