C++
static_assert
Ricerca…
Sintassi
- static_assert ( bool_constexpr , message )
- static_assert ( bool_constexpr ) / * Dal C ++ 17 * /
Parametri
Parametro | Dettagli |
---|---|
bool_constexpr | Espressione da controllare |
Messaggio | Messaggio da stampare quando bool_constexpr è falso |
Osservazioni
A differenza delle asserzioni di runtime , le asserzioni statiche vengono verificate in fase di compilazione e vengono applicate anche durante la compilazione di build ottimizzate.
static_assert
Le asserzioni significano che una condizione dovrebbe essere controllata e se è falsa, è un errore. Per static_assert()
, questo viene fatto in fase di compilazione.
template<typename T>
T mul10(const T t)
{
static_assert( std::is_integral<T>::value, "mul10() only works for integral types" );
return (t << 3) + (t << 1);
}
Un static_assert()
ha un primo parametro obbligatorio, la condizione, ovvero un constexpr bool. Potrebbe avere un secondo parametro, il messaggio, che è una stringa letterale. Da C ++ 17, il secondo parametro è facoltativo; prima di ciò, è obbligatorio.
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
È usato quando:
- In generale, è richiesta una verifica in fase di compilazione su alcuni tipi sul valore di constexpr
- Una funzione modello deve verificare alcune proprietà di un tipo passato ad esso
- Uno vuole scrivere casi di test per:
- metafunzioni modello
- funzioni di constexpr
- metaprogrammazione macro
- Alcune definizioni sono obbligatorie (per esempio, versione C ++)
- Porting di codice legacy, asserzioni su
sizeof(T)
(ad esempio, int a 32 bit) - Alcune funzionalità del compilatore sono necessarie per il funzionamento del programma (compressione, ottimizzazione della classe base vuota, ecc.)
Si noti che static_assert()
non partecipa a SFINAE : quindi, quando sono possibili sovraccarichi / specializzazioni aggiuntivi, non si dovrebbe usarlo al posto delle tecniche di metaprogrammazione del modello (come std::enable_if<>
). Potrebbe essere utilizzato nel codice del modello quando il sovraccarico / specializzazione previsto è già stato trovato, ma sono necessarie ulteriori verifiche. In questi casi, potrebbe fornire più messaggi di errore concreti che fare affidamento su SFINAE per questo.