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.

C ++ 17
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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow