En C++ la expresión ~true no produce false como se podría esperar de un simple vuelco bit a bit. En cambio, el lenguaje promueve el valor bool a un tipo integral antes de realizar la operación de complemento. El valor true (1) se convierte en un int, su complemento bit a bit es –2 bajo la aritmética de complemento a dos, y al convertir ese int de nuevo a bool se aplica la regla de conversión booleana: cualquier valor distinto de cero se convierte en true. Por lo tanto, static_cast<bool>(~true) se evalúa como true, un hecho confirmado por la fuente primaria, que recorre la salida del ensamblador correspondiente.

Cuando se aplica la misma operación a un enum con ámbito cuyo tipo subyacente es bool y está anotado con [[std::bitmask_type]], el resultado esperado según el estándar también es true. El operador de complemento bit a bit del enum primero convierte el enum a su tipo subyacente bool, promueve ese bool a int, calcula el complemento (‑2) y luego vuelve a castear el int al tipo del enum. Clang y MSVC realizan el último corte mediante la aplicación de la conversión booleana, obteniendo true. GCC, sin embargo, se desvia: trunca el valor int a su bit menos significativo (‑2 → 0) antes de hacer el caste, produciendo false. Esta discrepancia está documentada en la fuente primaria, que muestra enlaces Godbolt divergentes para los dos comportamientos.

Un riesgo relacionado surge con los enums sin ámbito que carecen de un tipo subyacente fijo. En este caso, el operador de complemento puede generar un valor fuera del rango representable del enum, y al volver a castear ese valor al tipo del enum se invoca un comportamiento indefinido. Por ejemplo, un enum nums {zero, one, two, three} tiene un tipo subyacente unsigned int; ~one produce ‑2 como int, pero al castear ‑2 de nuevo a nums se sale del rango, lo que el estándar marca como comportamiento indefinido. La fuente primaria explica este riesgo y señala que el problema solo afecta a los enums sin ámbito sin un tipo subyacente explícito, ya que los enums con ámbito y aquellos con un tipo subyacente fijo heredan un rango bien definido.