Каков тип константы перечисления, когда она используется вне определения перечисления без области видимости?
Рассмотрим следующий код:
#include <iostream>
enum modes
{
begin = 0,
end = 1
};
int main()
{
std::cout << std::boolalpha
<< std::is_same<unsigned int, typename std::underlying_type<modes>::type>::value
<< std::endl;
std::cout << sizeof(modes) << std::endl;
std::cout << (-100 + end) << std::endl;
}
Это дает на моей машине:
true
4
-99
Теперь, если я только изменю значение какого-либо другого перечислителя, begin
на 2147483648
, мой вывод станет следующим:
true
4
4294967197
По-видимому, это означает, что тип end
изменился с int
на unsigned int
, даже базовый тип modes
остался прежним (т.е. unsigned int
).
Существуют ли какие-то специальные правила для целостных промоушенов в отношении перечислений?