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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per