The complement of true is true, except when it's false
2 days ago
- P4313R1 提出使用 C++26 注解为枚举添加位掩码操作,但存在潜在陷阱。
- 整型提升:小于 int 的类型在位运算中会被提升为 int,这可能导致意外行为且无法避免。
- 布尔类型的按位取反运算由于布尔转换总会产生 true;然而 GCC 存在一个长期 bug,它会截断到最低位。
- 以 bool 为底层类型的枚举会导致混淆;GCC 截断到最低位,而 Clang/MSVC 遵循标准布尔转换。
- 没有固定底层类型的无作用域枚举具有有限的有效值范围;将超出范围的值(例如来自 operator~)进行强制转换是未定义行为。
- 用户定义的位掩码运算符应针对 bool 底层类型和无固定枚举加以约束以避免 UB;使用 E{0} 的特性可以检测无固定枚举。
- 将浮点数转换为以 bool 为后盾的枚举在不同编译器间不一致(GCC/Clang 截断,MSVC 进行布尔转换),可能导致潜在的 UB。
- P4313 应添加约束(例如针对有作用域枚举或非 bool 底层类型)以预防这些问题;作者计划联系该论文的作者。