Casting int to bool en C / C ++

Sé que en C y C ++, cuando lanzo bools a ints,(int)true == 1 y(int)false == 0. Me pregunto acerca de lanzar en la dirección inversa ...

En el código a continuación, todas las siguientes afirmaciones me resultaron verdaderas en archivos .c compilados con Visual Studio 2013 y Keil µVision 5. Aviso(bool)2 == true.

¿Qué dicen los estándares C y C ++ sobre la conversión de enteros distintos de cero a bools? ¿Se especifica este comportamiento? Por favor incluya citas.

#include <stdbool.h>
#include <assert.h>

void TestBoolCast(void)
{
    int i0 = 0, i1 = 1, i2 = 2;

    assert((bool)i0 == false);
    assert((bool)i1 == true);
    assert((bool)i2 == true);

    assert(!!i0 == false);
    assert(!!i1 == true);
    assert(!!i2 == true);
}

No un duplicado de¿Puedo suponer (bool) true == (int) 1 para cualquier compilador de C ++?:

Fundición en la dirección inversa (int -> bool).No hay discusión allí de valores distintos de cero.

Respuestas a la pregunta(2)

Su respuesta a la pregunta