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