Recientemente examiné P4313 R1, una propuesta de estándar que añade operaciones de máscara de bits para enums mediante una anotación C++26. El concepto central utiliza `[[=std::bitmask_type]]` para generar automáticamente operadores bit a bit, eliminando la necesidad de implementación manual. Aunque los compiladores C++ calculan felizmente operaciones bit a bit en tipos enteros, un detalle crítico involucra la promoción entera.
Tipos más pequeños que `int`, como `short`, se promueven a `int` antes de que ocorra la operación. Esto significa que el tipo de resultado de operaciones sobre tipos más pequeños predeterminadamente es `int`, requiriendo un `static_cast` de vuelta al tipo original para evitar comportamientos inesperados. Además, `bool` presenta peligros únicos.
La conversión booleana no truncada patrones de bits; en su lugar, mapea cualquier valor no cero a `true` (valor entero 1) y cero a `false`. Combinando estas reglas revela un extraño fenómeno: el complemento de `true` (`~true`) promueve `true` a `int` (valor 1), calcula el resultado del complemento de dos como `-2`, y dado que `-2` es no cero, la conversión booleana devuelve `true`. Por lo tanto, `static_cast(~true) == true`.
Este comportamiento se extiende a enums basados en `bool`, como aquellos definidos con `[[=std::bitmask_type]]`, destacando la importancia de entender estas conversiones implícitas para el desarrollo robusto en C++.
Fuente: Hacker News · Resumido por HeadlinesBriefing