该标准允许人们在整数类型、anenum
和 a之间进行选择std::bitset
。
考虑到这些选择,为什么库实现者会使用其中一个?
例如,llvm 的 libcxx 似乎使用了(至少)以下两个实现选项的组合:
ctype_base::mask
使用整数类型实现:
<__locale>
regex_constants::syntax_option_type
使用enum
+ 重载运算符实现:
<regex>
gcc 项目的 libstdc++ 使用所有三个:
ios_base::fmtflags
使用枚举 + 重载运算符实现:<bits/ios_base.h>
regex_constants::syntax_option_type
使用整数类型
regex_constants::match_flag_type
实现,使用std::bitset
Both 实现:<bits/regex_constants.h>
AFAIK,gdb 无法“检测”这三个选项中任何一个的位域,因此增强调试不会有区别。
enum
解决方案和整数类型解决方案应始终使用相同的空间。std::bitset
似乎没有做出保证,sizeof(std::bitset<32>) == std::uint32_t
所以我看不出有什么特别吸引人的地方std::bitset
。
该enum
解决方案似乎不太安全,因为掩码的组合不会生成枚举器。
严格来说,上述内容是关于n3376而不是 FDIS(因为我无权访问 FDIS)。
在这方面的任何可用启示将不胜感激。