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