Почему 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 является допустимым значением для любого типа перечисления.

Другие вопросы по тегам