Suche…


Syntax

  • static_assert ( bool_constexpr , message )
  • static_assert ( bool_constexpr ) / * seit C ++ 17 * /

Parameter

Parameter Einzelheiten
bool_constexpr Ausdruck zum Überprüfen
Botschaft Nachricht, die gedruckt werden soll, wenn bool_constexpr falsch ist

Bemerkungen

Im Gegensatz zu Laufzeit-Assertions werden statische Assertions zur Kompilierzeit geprüft und auch beim Kompilieren optimierter Builds erzwungen.

static_assert

Assertationen bedeuten, dass eine Bedingung geprüft werden muss, und wenn sie falsch ist, handelt es sich um einen Fehler. Bei static_assert() wird dies zur Kompilierzeit gemacht.

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

Ein static_assert() hat einen obligatorischen ersten Parameter, die Bedingung, dh ein bool constexpr. Es kann einen zweiten Parameter enthalten, die Nachricht, also ein Zeichenkettenliteral. In C ++ 17 ist der zweite Parameter optional. davor ist es obligatorisch.

C ++ 17
template<typename T>
T mul10(const T t)
{
    static_assert(std::is_integral<T>::value);
    return (t << 3) + (t << 1);
}

Es wird verwendet, wenn:

  • Im Allgemeinen ist eine Überprüfung zur Kompilierungszeit für einen Typ auf den Wert "constexpr" erforderlich
  • Eine Vorlagenfunktion muss bestimmte Eigenschaften eines an sie übergebenen Typs überprüfen
  • Man möchte Testfälle schreiben für:
    • Vorlagen-Metafunktionen
    • Constexpr-Funktionen
    • Makro-Metaprogrammierung
  • Bestimmte Definitionen sind erforderlich (z. B. C ++ - Version)
  • Portierung von Legacy-Code, Zusicherungen zu sizeof(T) (z. B. 32-Bit-Int)
  • Bestimmte Compiler-Funktionen sind für das Programm erforderlich (Packen, leere Basisklassenoptimierung usw.).

Beachten Sie, dass static_assert() nicht an SFINAE beteiligt ist. Wenn zusätzliche Überladungen / Spezialisierungen möglich sind, sollten Sie sie nicht anstelle von Metaprogrammierungsmethoden für Vorlagen (wie std::enable_if<> ) verwenden. Es kann im Vorlagencode verwendet werden, wenn die erwartete Überlastung / Spezialisierung bereits gefunden wurde, weitere Überprüfungen jedoch erforderlich sind. In solchen Fällen kann es konkretere Fehlermeldungen geben, als sich auf SFINAE zu verlassen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow