sobrecarga overload operator bitwise c++ boolean language-lawyer comparison-operators

bitwise - overload operator c++



¿La operación "falso<verdadero" está bien definida? (4)

Boolean false es equivalente a int 0 , y boolean true es equivalente a int 1 . Esto explica por qué la expresión false < true => 0 < 1 es la única que devuelve true .

¿La especificación de C ++ define:

  1. la existencia del operador ''menor que'' para los parámetros booleanos, y si es así,
  2. el resultado de las permutaciones de 4 parámetros?

En otras palabras, ¿los resultados de las siguientes operaciones están definidos por la especificación?

false < false false < true true < false true < true

En mi configuración (Centos 7, gcc 4.8.2), el código siguiente arroja lo que esperaba (dado el historial de C de representar falsa como 0 y verdadera como 1):

false < false = false false < true = true true < false = false true < true = false

Aunque estoy bastante seguro de que la mayoría (¿todos?) Los compiladores darán el mismo resultado, ¿está esto legislado por la especificación C ++? ¿O es que un compilador ofuscante, pero que cumpla con las especificaciones, puede decidir que true es menos que falso?

#include <iostream> const char * s(bool a) { return (a ? "true" : "false"); } void test(bool a, bool b) { std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl; } int main(int argc, char* argv[]) { test(false, false); test(false, true); test(true, false); test(true, true); return 0; }


De acuerdo con el estándar C ++ (5.9 operadores relacionales)

2 Las conversiones aritméticas habituales se realizan en operandos de tipo aritmético o de enumeración.

y

1 ... El tipo de resultado es bool.

y (3.9.1 Tipos fundamentales)

6 Los valores de tipo bool son verdaderos o falsos.49 [Nota: no hay tipos o valores de bool con signo, sin signo, corto o largo. -finalizar nota] Los valores de tipo bool participan en promociones integrales (4.5).

y (4.5 promociones integrales)

6 Un prvalue de tipo bool se puede convertir en un prvalue de tipo int, con falso que se convierte en cero y verdadero que se convierte en uno .

Entonces, en todos los ejemplos, true se convierte a int 1 y false se convierte a int 0

Estas expresiones

false < false false < true true < false true < true

son completamente equivalentes a

0 < 0 0 < 1 1 < 0 1 < 1


Los valores booleanos están sujetos a las promociones enteras usuales, con false definida como 0 y true definida como 1 . Eso hace que todas las comparaciones estén bien definidas.


TL; DR:

Las operaciones están bien definidas según el borrador del estándar C ++.

Detalles

Podemos verlo yendo al borrador de la sección 5.9 estándares de C ++ , operadores relacionales que dice (el énfasis es mío en el futuro ):

Los operandos deben tener aritmética , enumeración o tipo de puntero o tipo std :: nullptr_t. Los operadores <(menor que),> (mayor que), <= (menor o igual que) y> = (mayor que o igual a) arrojan valores falsos o verdaderos. El tipo de resultado es bool

y bools son tipos aritmáticos de 3.9.1 Tipos fundamentales

Los tipos bool , char, char16_t, char32_t, wchar_t y los tipos enteros con signo y sin signo se denominan colectivamente tipos integrales.

y

Los tipos integrales y flotantes se denominan colectivamente tipos aritméticos.

y true y false son literales booleanos de 2.14.6 literales booleanos:

boolean-literal: false true

Volviendo a la sección 5.9 para ver más allá la mecánica de los operadores relacionales, dice:

Las conversiones aritméticas habituales se realizan en operandos de tipo aritmético o de enumeración.

las conversiones aritméticas usuales están cubiertas en la sección 5 que dice:

De lo contrario, las promociones integrales (4.5) se realizarán en ambos operandos

y la sección 4.5 dice:

Un prvalue de tipo bool se puede convertir a un prvalue de tipo int, con falso convirtiéndose en cero y verdadero convirtiéndose en uno.

y entonces las expresiones:

false < false false < true true < false true < true

usando estas reglas se convierten en:

0 < 0 0 < 1 1 < 0 1 < 1