Почему static_assert в шаблоне дает мне другой результат с эквивалентными выражениями?
Я заметил странное поведениеstatic_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;
}
Компилируется нормально:http://ideone.com/wHbJYP , Я бы ожидал
static_assert(0, "Invalid dimension for vector!");
чтобы дать мне тот же результат, но это вызывает ошибку статического утверждения:http://ideone.com/UEu9Kv , Правильно ли gcc в обоих случаях? Если так, то почему? Или это ошибка GCC? Тогда, в каком случае GCC является правильным?