2010-06-23 12 views

risposta

13
STATIC_ASSERT(true); 

significa infatti

static_assert<true>(); 

che valuta a nulla. static_assert<true> è solo una struttura vuota senza membri. static_assert<true>() crea un oggetto di quella struttura e non lo memorizza da nessuna parte.

Questo semplicemente compila e non fa nulla.

D'altra parte

STATIC_ASSERT(false); 

significa

static_assert<false>(); 

che si traduce in errore di compilazione. static_assert non ha alcuna specializzazione per false. Quindi viene usata una forma generale. Ma la forma generale è data come segue:

template <bool> 
struct static_assert; 

che è solo una dichiarazione di una struttura e non la sua definizione. Pertanto, static_assert<false>() causa un errore di compilazione mentre tenta di creare un oggetto di una struttura che non è definito.

+0

+1 Ottima spiegazione – fingerprint211b

2

Beh, immagino che riguardi la specializzazione dei modelli. STATIC_ASSERT (true) verrà compilato correttamente, poiché esiste una definizione (non solo una dichiarazione) di "static_assert < true>".

STATIC_ASSERT (false) verrà rifiutato dal compilatore, poiché esiste solo una dichiarazione per "static_assert < false>" e nessuna definizione.

Update: per Visual Studio, STATIC_ASSERT (vero) è ok, ma STATIC_ASSERT (false) genera l'errore: "Errore C2514: 'static_assert < __formal>': classe non ha costruttori [con __formal = false]"

9

static_assert<true>(); fa che

template <> 
struct static_assert<true> {} 

su modelli struct specializzazione creazione oggetto temporaneo stato fatto - una chiamata al costruttore e poi a un distruttore che entrambi saranno auspicabilmente eliminati dal programma di ottimizzazione in quanto non fanno nulla. Poiché esiste solo una specializzazione per true e nessuna versione generica della struttura del modello, tutti i costrutti che valutano in static_assert<false>(); non verranno compilati.

+0

Grazie per la spiegazione, anch'io mi sono ritrovato perso in questa sintassi. – PeterK

4

Nell'espressione

static_assert<true>(); 

dal static_assert<true> è un tipo, si chiamerà il costruttore static_assert<true>. Siccome lo static_assert<true> è specializzato in una struttura vuota, nulla sarà interessato.


Tuttavia, in

static_assert<false>(); 

quanto non v'è alcuna specializzazione per static_assert<false>, la definizione generica sarà usato

template <bool> 
struct static_assert; 

. Ma qui, il tipo static_assert<B> è incompleto. Quindi chiamare il costruttore di static_assert<B> comporterà un errore di compilazione.


Pertanto, questo si chiama "assert statica", come la dichiarazione interrompe la compilazione se l'espressione restituisce false, simile al normal assert() function che ucciderà il programma in fase di esecuzione.

Problemi correlati