2015-05-15 7 views
8

Perché il compilatore di Visual Studio 2013 rifiuta il primo asser statico (Errore C2057), ma non il secondo?Perché una costante è l'espressione, ma non l'altra?

#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

Probabilmente perché il [compiler VS 2013 non supporta] (https://msdn.microsoft.com/en-us/library/hh567368.aspx) 'constexpr' ancora. –

+2

@DarkFalcon: il compilatore VS 2013 non lo farà mai! :) –

+0

Compila bene su VS2015 RC. – Ajay

risposta

8

Direi che, in quel implementazione, max() non è constexpr (come C++ 11 dice che dovrebbe essere), in modo che maxHz non è un'espressione costante, mentre minHz e invalidHz sono.

Quindi la prima affermazione fallisce perché non può essere valutata in fase di compilazione; il secondo ha esito positivo, perché il confronto prima di || è vero, quindi il secondo confronto non viene valutato.

+0

Questo sembra corretto - se l'ordine è cambiato (nel secondo assert) non riesce a compilare come il primo. – jtooker

+0

Questa è solo una cosa di MSVC o un problema comune con questo tipo di inizializzazione? –

+0

@WillBickford: la mancanza di 'constexpr' è una cosa MSVC - dovrebbe essere un'espressione costante su qualsiasi implementazione conforme di C++ 11 (o successiva). Il requisito per un'espressione costante in 'static_assert' e la valutazione di cortocircuito di' || ', sono standard. –