Condividi tramite


static_assert

Verifica un'asserzione software in fase di compilazione. Se l'espressione costante specificata è false, il compilatore visualizza il messaggio specificato, se ne viene specificato uno e la compilazione ha esito negativo con errore C2338; in caso contrario, la dichiarazione non ha alcun effetto.

Sintassi

static_assert( constant-expression, string-literal );

static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)

Parametri

constant-expression
Espressione costante integrale che può essere convertita in un valore booleano. Se l'espressione valutata è zero (false), viene visualizzato il parametro string-literal e la compilazione ha esito negativo con un errore. Se l'espressione è diversa da zero (true), la static_assert dichiarazione non ha alcun effetto.

string-literal
Messaggio visualizzato se il parametro constant-expression è zero. Il messaggio è una stringa di caratteri nel set di caratteri di base del compilatore, ovvero non caratteri multibyte o wide.

Osservazioni:

Il parametro constant-expression di una static_assert dichiarazione rappresenta un'asserzione software. Un'asserzione software specifica una condizione che si prevede abbia valore True in un particolare punto del programma. Se la condizione è true, la static_assert dichiarazione non ha alcun effetto. Se la condizione è false, l'asserzione ha esito negativo, il compilatore visualizza il messaggio nel parametro stringa-letterale e la compilazione ha esito negativo con un errore. In Visual Studio 2017 e versioni successive il parametro string-literal è facoltativo.

La static_assert dichiarazione verifica un'asserzione software in fase di compilazione. Al contrario, le funzioni di asserzione Macro e _assert e _wassert testano un'asserzione software in fase di esecuzione e comportano un costo di runtime nello spazio o nel tempo. La static_assert dichiarazione è particolarmente utile per il debug dei modelli perché gli argomenti del modello possono essere inclusi nel parametro constant-expression .

Il compilatore esamina la static_assert dichiarazione per individuare gli errori di sintassi quando viene rilevata la dichiarazione. Il compilatore valuta immediatamente il parametro constant-expression se non dipende da un parametro di modello. In caso contrario, il compilatore valuta il parametro constant-expression quando viene creata un'istanza del modello. Di conseguenza, il compilatore potrebbe generare un messaggio di diagnostica una volta quando la dichiarazione viene rilevata e nuovamente quando viene creata un'istanza del modello.

È possibile usare la parola chiave nell'ambito dello spazio dei nomi, della static_assert classe o del blocco. La static_assert parola chiave è tecnicamente una dichiarazione, anche se non introduce un nuovo nome nel programma, perché può essere usata nell'ambito dello spazio dei nomi.

Descrizione di static_assert con ambito dello spazio dei nomi

Nell'esempio seguente la static_assert dichiarazione ha un ambito dello spazio dei nomi. Poiché il compilatore riconosce la dimensione di tipo void *, l'espressione viene valutata immediatamente.

Esempio: static_assert con ambito dello spazio dei nomi

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

Descrizione di con ambito di static_assert classe

Nell'esempio seguente la static_assert dichiarazione ha un ambito di classe. Verifica static_assert che un parametro di modello sia un tipo pod (Plain Old Data ). Il compilatore esamina la static_assert dichiarazione quando viene dichiarata, ma non valuta il parametro constant-expression finché non viene creata un'istanza del basic_string modello di classe in main().

Esempio: static_assert con ambito di classe

#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
    static_assert(std::is_pod<CharT>::value,
                  "Template argument CharT must be a POD type in class template basic_string");
    // ...
    };
}

struct NonPOD {
    NonPOD(const NonPOD &) {}
    virtual ~NonPOD() {}
};

int main()
{
    std::basic_string<char> bs;
}

Descrizione di static_assert con ambito blocco

Nell'esempio seguente la static_assert dichiarazione ha un ambito di blocco. static_assert Verifica che le dimensioni della struttura VMPage siano uguali alle pagine di memoria virtuale del sistema.

Esempio: static_assert nell'ambito del blocco

#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
    struct VMPage { // ...
           };
    int check_pagesize() {
    static_assert(sizeof(VMPage) == PAGESIZE,
        "Struct VMPage must be the same size as a system virtual memory page.");
    // ...
    }
// ...
};

Vedi anche

Asserzione e messaggi specificati dall'utente (C++)
Direttiva #error (C/C++)
assert Macro, _assert, _wassert
Modelli
Set di caratteri ASCII
Dichiarazioni e definizioni