sobrecarga - overload operator() c++




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

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

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






comparison-operators