2015-05-15 2 views
8

Почему компилятор Visual Studio 2013 отклоняет первое статическое утверждение (ошибка C2057), но не второе?Почему одно выражение постоянное, но не другое?

#include <limits> 

typedef int Frequency; 

const Frequency minHz{ 0 }; 
const Frequency maxHz{ std::numeric_limits<Frequency>::max() }; 
const Frequency invalidHz{ -1 }; 
static_assert(minHz < maxHz, "minHz must be less than maxHz");    // C2057 
static_assert(invalidHz < minHz || invalidHz > maxHz, "invalidHz is valid"); // OK 
+5

Возможно, потому что [компилятор VS 2013 не поддерживает] (https://msdn.microsoft.com/en-us/library/hh567368.aspx) 'constexpr' еще. –

+2

@DarkFalcon: компилятор VS 2013 никогда не будет! :) –

+0

Хорошо компилируется на VS2015 RC. – Ajay

ответ

8

Я предположил бы, что в этой реализации, max() не constexpr (как C++ 11 говорит, что это должно быть), так что maxHz не является константным выражением, в то время как minHz и invalidHz есть.

Таким образом, первое утверждение терпит неудачу, поскольку оно не может быть оценено во время компиляции; второй выполняется успешно, потому что сравнение до || истинно, поэтому второе сравнение не оценивается.

+0

Это выглядит правильно - если порядок переключается (во втором утверждении) он не компилируется, как первый. – jtooker

+0

Это просто проблема с MSVC или общая проблема с этим типом инициализации? –

+0

@WillBickford: Отсутствие 'constexpr' - это вещь MSVC - это должно быть постоянное выражение для любой соответствующей реализации C++ 11 (или более поздней). Требование постоянного выражения в 'static_assert' и оценка короткого замыкания' || 'являются стандартными. –