Warum gibt mir static_assert in template ein anderes Ergebnis mit äquivalenten Ausdrücken?

Ich habe merkwürdiges Verhalten von @ bemerstatic_assert:

#include <iostream>

template <typename T, unsigned int D> struct Vec
{
    static_assert(D && 0, "Invalid dimension for vector!");
};

template <typename T> struct Vec<T, 1>             {union {T x, r;};};
template <typename T> struct Vec<T, 2> : Vec<T, 1> {union {T y, g;};};
template <typename T> struct Vec<T, 3> : Vec<T, 2> {union {T z, b;};};
template <typename T> struct Vec<T, 4> : Vec<T, 3> {union {T w, a;};};

int main()
{
    Vec<float, 3> v;
    v.x = 1;
    v.y = 2;
    v.z = 3;

    return 0;
}

Es kompiliert gut:http: //ideone.com/wHbJY. Ich würde erwarte

static_assert(0, "Invalid dimension for vector!");

, um das gleiche Ergebnis zu erhalten, aber es führt zu einem statischen Assertionsfehler:http: //ideone.com/UEu9K. Ist gcc in beiden Fällen korrekt? Wenn ja warum? Oder ist es ein GCC-Fehler? In welchem Fall ist dann gcc korrekt?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage