Стандарт позволяет выбирать между целочисленным типом, enum
и std::bitset
.
Зачем разработчику библиотеки использовать один вместо другого при таком выборе?
Например, libcxx llvm, по-видимому, использует комбинацию (по крайней мере) двух из этих вариантов реализации:
ctype_base::mask
реализован с использованием целочисленного типа:
<__locale>
regex_constants::syntax_option_type
реализован с использованием enum
+ перегруженные операторы:
libstdc++ проекта gcc использует все три:
ios_base::fmtflags
реализован с использованием enum + перегруженные операторы:
regex_constants::syntax_option_type
реализован с использованием целочисленного типа,
regex_constants::match_flag_type
реализован с использованием std::bitset
Оба:
AFAIK, gdb не может "обнаружить" битовое поле любого из этих трех вариантов, чтобы не было разницы в расширенной отладке.
Решение enum
и решение целочисленного типа всегда должны использовать одно и то же пространство. std::bitset
, похоже, не гарантирует, что sizeof(std::bitset) == std::uint32_t
, поэтому я не вижу, что особенно привлекательно о std::bitset
.
Решение enum
кажется немного менее безопасным для типов, поскольку комбинации масок не создают перечислитель.
Строго говоря, вышесказанное относится к n3376, а не к FDIS (поскольку у меня нет доступа к FDIS).
Буду признателен за любое доступное просветление в этой области.