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.

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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow