C++11 и [17.5.2.1.3] Типы битовой маски

Стандарт позволяет выбирать между целочисленным типом, 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).

Буду признателен за любое доступное просветление в этой области.

7
задан Xeo 25 March 2012 в 02:16
поделиться