Похоже, что оператор <сбрасывает компилятор с неверной дорожки.Если вы: </p>
static_assert( Assign_Low_High<L>::low_value > -1, "Incorrect Range");
или
static_assert( (Assign_Low_High<L>::low_value) < 1, "Incorrect Range");
, это будет работать.
Если вы сделаете:
static_assert( Assign_Low_High<L>::low_value < 1 > 0, "Incorrect Range");
, тогда это будет интересно...
Я думаю, что компилятор должен рассматривать имя, зависящее от low_value, как имя, не зависящее от типа и не зависящее от шаблона, и считать, что "<", следующее за low_value, является оператором меньше чем.Поэтому я бы сказал, что компилятор gcc делает правильные вещи, в то время как компилятор MS 2010 этого не делает, но, к счастью, с его помощью можно добиться желаемого эффекта. </p>
Еще одна вещь, это, очевидно, не связано с static_assert, поскольку:
bool bComp = Assign_Low_High<int>::low_value < 1;
непосредственно в main приводит к тем же ошибкам компиляции ...