C++ 11和[17.5.2.1.3]位掩码类型

use*_*696 7 c++ enums bitmask c++11 libc++

标准允许在整数类型,a enum和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).

在这方面的任何可用的启示将不胜感激.

Bo *_*son 0

为什么该标准允许使用不同的方式来实现该库?答案是:为什么不呢?

正如您所看到的,所有三个选项显然都在某些实现中使用。如果可以避免的话,该标准不希望现有的实现变得不合格。

使用位集的原因之一可能是它的大小比枚举或整数更适合。并非所有系统都有std::uint32_t. 也许bitset<24>在那里工作会更好?