template <int N, int P = 1, int Q = 0, int A = 1, int B = 0>
struct fib {
enum { value = ((N & 1) == 1) ? 0 + fib<N-1,P,Q,A*(P+Q)+P*B,P*A+Q*B>::value : fib<(N>>1),P*P+2*P*Q,P*P+Q*Q,A,B>::value };
};

template <int P, int Q, int A, int B>
struct fib<0, P, Q, A, B>{
enum { value = B };
};

というコードはコンパイルできるのですが、0 + を消すとコンパイルできません。なんでですか?