Ответ 1
это будет работать правильно
Нет. enum
не предназначен для "обтекания" так, как вы описываете по умолчанию.
И enum class
С++ 11 не гарантирует смежные значения, так же, как вы описываете для enum
С++ 03.
Вы можете определить поведение обёртывания для вашего конкретного перечисления. Это решение предполагает, что значения являются смежными, как и перечисленные вами перечисления.
enum class Colors { Black, Blue, White, END_OF_LIST };
// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
using IntType = typename std::underlying_type<Colors>::type
c = static_cast<Colors>( static_cast<IntType>(c) + 1 );
if ( c == Colors::END_OF_LIST )
c = static_cast<Colors>(0);
return c;
}
// Special behavior for Colors++
Colors operator++( Colors &c, int ) {
Colors result = c;
++c;
return result;
}