static_assert

Überprüft eine Softwareassertion zur Kompilierzeit. Wenn der angegebene Konstantenausdruck lautet false, zeigt der Compiler die angegebene Meldung an, sofern vorhanden, und die Kompilierung schlägt mit fehler C2338 fehl. Andernfalls hat die Deklaration keine Auswirkung.

Syntax

static_assert( constant-expression, string-literal );

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

Parameter

constant-expression(konstanter Ausdruck)
Ein ganzzahliger konstanter Ausdruck, der in einen booleschen Wert konvertiert werden kann. Wenn der ausgewertete Ausdruck null (false) ist, wird der Zeichenfolgenliteralparameter angezeigt, und die Kompilierung schlägt mit einem Fehler fehl. Wenn der Ausdruck "nonzero" (true) ist, hat die static_assert Deklaration keine Auswirkung.

Zeichenfolgenliteral
Eine Meldung, die angezeigt wird, wenn der Parameter für konstanten Ausdruck null ist. Die Nachricht ist eine Zeichenfolge von Zeichen im Basiszeichensatz des Compilers, d. h. nicht multibyte oder breit.

Hinweise

Der Konstantenausdrucksparameter einer static_assert Deklaration stellt eine Software assertion dar. Eine Softwareassertion gibt eine Bedingung an, die an einer bestimmten Stelle im Programm "true" sein muss. Wenn die Bedingung "true" ist, hat die static_assert Deklaration keine Auswirkung. Wenn die Bedingung falsch ist, schlägt die Assertion fehl, zeigt der Compiler die Meldung im Zeichenfolgenliteralparameter an, und die Kompilierung schlägt mit einem Fehler fehl. In Visual Studio 2017 und höher ist der Zeichenfolgenliteralparameter optional.

Die static_assert Deklaration testet zur Kompilierungszeit eine Software assertion. Im Gegensatz dazu testen die Funktionen "Makro" und _assert und _wassert eine Software assertion zur Laufzeit und verursachen einen Laufzeitaufwand in Raum oder Zeit. Die static_assert Deklaration ist besonders nützlich für das Debuggen von Vorlagen, da Vorlagenargumente in den Parameter "Konstantenausdruck " eingeschlossen werden können.

Der Compiler untersucht die static_assert Deklaration auf Syntaxfehler, wenn die Deklaration auftritt. Der Compiler wertet den Parameter für konstanten Ausdruck sofort aus, wenn er nicht von einem Vorlagenparameter abhängt. Andernfalls wertet der Compiler den Parameter "Konstantenausdruck " aus, wenn die Vorlage instanziiert wird. Daher gibt der Compiler möglicherweise eine Diagnosemeldung aus: einmal, wenn die Deklaration gefunden wird, und noch einmal, wenn die Vorlage instanziiert wird.

Sie können die static_assert Schlüsselwort (keyword) im Namespace, in der Klasse oder im Blockbereich verwenden. (Die static_assert Schlüsselwort (keyword) ist technisch eine Deklaration, obwohl sie keinen neuen Namen in Ihr Programm einführt, da sie im Namespacebereich verwendet werden kann.)

Beschreibung des Namespacebereichs static_assert

Im folgenden Beispiel weist die static_assert Deklaration den Namespacebereich auf. Da der Compiler die Größe des Typs void * kennt, wird der Ausdruck sofort ausgewertet.

Beispiel: static_assert mit Namespacebereich

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

Beschreibung des Klassenbereichs static_assert

Im folgenden Beispiel weist die static_assert Deklaration den Klassenbereich auf. Die static_assert Überprüfung, dass ein Vorlagenparameter ein einfacher alter Datentyp (POD) ist. Der Compiler untersucht die static_assert Deklaration, wenn sie deklariert wird, wertet den Parameter für den Konstantenausdruck jedoch erst aus, wenn die basic_string Klassenvorlage instanziiert main()wird.

Beispiel: static_assert mit Klassenbereich

#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;
}

Beschreibung des Blockbereichs static_assert

Im folgenden Beispiel weist die Deklaration den static_assert Blockbereich auf. Die static_assert Überprüfung, ob die Größe der VMPage-Struktur den virtuellen Speicherseiten des Systems entspricht.

Beispiel: static_assert im Blockbereich

#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.");
    // ...
    }
// ...
};

Siehe auch

Assertion und benutzerdefinierte Meldungen (C++)
#error-Direktive (C/C++)
assert Macro, _assert, _wassert
Vorlagen
ASCII-Zeichensatz
Deklarationen und Definitionen