Hasty Briefsbeta

双语

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 底层类型)以预防这些问题;作者计划联系该论文的作者。