C++
static_assert
Sök…
Syntax
- static_assert ( bool_constexpr , meddelande )
- static_assert ( bool_constexpr ) / * Sedan C ++ 17 * /
parametrar
Parameter | detaljer |
---|---|
bool_constexpr | Uttryck att kontrollera |
meddelande | Meddelande för att skriva ut när bool_constexpr är falsk |
Anmärkningar
Till skillnad från påståenden om runtime , kontrolleras statiska påståenden vid sammanställningstid och verkställs också vid sammanställning av optimerade builds.
static_assert
Påståenden innebär att ett villkor bör kontrolleras och om det är falskt är det ett fel. För static_assert()
görs detta kompileringstid.
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);
}
En static_assert()
har en obligatorisk första parameter, villkoret, det vill säga en bool constexpr. Det kan ha en andra parameter, meddelandet, som är en strängbokstav. Från C ++ 17 är den andra parametern valfri; innan det är det obligatoriskt.
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
Det används när:
- I allmänhet krävs en verifiering vid sammanställningstid för någon typ av constexpr-värde
- En mallfunktion måste verifiera vissa egenskaper av en typ som skickas till den
- Man vill skriva testfall för:
- mallmetafunktioner
- constexpr-funktioner
- makrometaprogrammering
- Vissa definieringar krävs (för ex., C ++ -version)
- Portation av äldre kod, påståenden om
sizeof(T)
(t.ex. 32-bitars int) - Vissa kompilatorfunktioner krävs för att programmet ska fungera (packning, tom basklassoptimering, etc.)
Observera att static_assert()
inte deltar i SFINAE : alltså, när ytterligare överbelastningar / specialiseringar är möjliga, bör man inte använda det istället för mallmetaprogrammeringstekniker (som std::enable_if<>
). Det kan användas i mallkod när den förväntade överbelastningen / specialiseringen redan finns, men ytterligare verifikationer krävs. I sådana fall kan det ge mer konkreta felmeddelanden än att lita på SFINAE för detta.