在C++中,特別是在C++ 14 n4296中,有兩個章節討論枚舉類型,這似乎與我相矛盾。見7.2/5(其是10.2/5在n4659
):枚舉聲明中枚舉數的類型
每個枚舉定義了類型,它是從所有其他類型不同。每個枚舉也有一個基礎類型。基礎類型可以使用enum-base明確指定。對於範圍枚舉類型,如果未明確指定,則基礎類型爲int。在這兩種情況下,底層類型都被認爲是固定的。在enum-specifier的大括號之後,每個枚舉器都有其枚舉類型。 如果基礎類型是固定的,則在大括號之前的每個枚舉器的類型是基礎類型,並且枚舉器定義中的常量表達式應該是基礎類型的轉換常數表達式[012]
而且5.1.1/11(其是在n4659
8.1.4.2/4)寫道:
嵌套名說明符,它表示一個枚舉(7.2),接着是枚舉的名稱該枚舉是一個指向枚舉數的合格標識。結果是枚舉器。 結果的類型是枚舉類型。結果是一個prvalue。
然後,當我們在關閉括號聲明之前通過嵌套名稱說明符引用枚舉數時會發生什麼?舉個例子下面的代碼片斷:
template < typename T1, typename T2 >
struct fail_if_not_same {
static_assert(std::is_same<T1, T2>::value, "Fail!");
static constexpr int value = 0;
};
enum class E : short {
A,
B = A + 1,
C = fail_if_not_same<decltype(B), short>::value,
D = fail_if_not_same<decltype(E::B), short>::value
};
什麼是表達上述E::B
類型?這是標準中的矛盾嗎? gcc和clang都遵循7.2/5。
請注意:C++ 17(n4618)中的5.1.1/11是5.1.4.2/4。 – kennytm