Почему C++11 определяет несуществующее значение как значение по умолчанию?
Ниже приводится выдержка из ссылки 1 cppreference и ссылки 2 cppreference:
enum codecvt_mode
{
consume_header = 4,
generate_header = 2,
little_endian = 1
};
template
<
class Elem,
unsigned long Maxcode = 0x10ffff,
std::codecvt_mode Mode = (std::codecvt_mode)0
>
class codecvt_utf8_utf16 : public std::codecvt<Elem, char, std::mbstate_t>;
Очевидно, что 0
не является четко определенным значением типа enum codecvt_mode
, Стандарт C++ может намеренно оставить значение по умолчанию определенным реализацией.
Тем не менее, я думаю, что значение по умолчанию, определяемое реализацией, может быть неопределенным для пользователя.
Почему C++11 определяет
std::codecvt_mode Mode = (std::codecvt_mode)0
скорее, чем
std::codecvt_mode Mode = std::little_endian
?
2 ответа
Перечисление - это набор битовых флагов, которые можно объединять (с помощью побитовых операций), а не значения, которые выбираются независимо. Нулевое значение означает, что ни один из флагов не активен (что делает его прямым порядком байтов и не использует и не генерирует спецификацию).
0
является допустимым значением для вашего типа enum. В соответствии со стандартом языка типы перечислений, базовый тип которых не является фиксированным (ваш случай), могут представлять все целочисленные значения, представимые в битовом поле достаточной ширины (достаточной для представления всех именованных членов перечисления, которые вы объявили). Тот факт, что вам иногда требуется явное приведение, чтобы принудительно ввести все эти значения в этот тип перечисления, является лишь небольшим неудобством. Это означает, что 0
является допустимым значением для любого типа перечисления.