Inicialização const estática incorreta que compila e funciona

Até onde eu sei, você só pode inicializar membros const estáticos na mesma linha da declaraçãose eles são tipos integrais. No entanto, eu ainda era capaz de inicializar e usar algumas constantes estáticas duplas:

// compiles and works, values are indeed doubles
struct Foo1{ 
    static const double A=2.5;
    static const double B=3.2;
    static const double C=1.7;
};

// compiles, but values are cast to int
struct Foo2{
    static const int A=2;
    static const int B=3;
    static const double C=B/A; //becomes 1
};

// does not compile, Foo3::B cannot appear in a constant-expression
struct Foo3{ 
    static const int A=2;
    static const double B=3;
    static const double C=A/B; 
};

// does not compile, a cast to a type other than an integral or enumeration
// cannot appear in a constant-expression
struct Foo4{ 
    static const int A=2;
    static const int B=3;
    static const double C=(double)A/B; 
};

O Foo2 é compilado, mas o Foo2 :: C se torna 1, portanto, talvez seja tratado como um int, pois é numericamente um. Foo3 e Foo4 nem sequer compilam, como esperado. No entanto, não entendo por que o Foo1 compila e funciona corretamente. Esse uso específico é aceito? É por causa de alguma otimização? (Eu tentei usar -O1 e -O0)

Nota: usando o GNU 5.2.0 com cmake e configurando o padrão para C ++ 98. Mudar para o C ++ 11 funciona bem (ou seja, não é compilado e pede para alternar esses membros para constexpr).

questionAnswers(1)

yourAnswerToTheQuestion