Zoeken…


Syntaxis

  • static_assert ( bool_constexpr , bericht )
  • static_assert ( bool_constexpr ) / * Sinds C ++ 17 * /

parameters

Parameter Details
bool_constexpr Uitdrukking om te controleren
bericht Bericht om af te drukken wanneer bool_constexpr onwaar is

Opmerkingen

In tegenstelling tot runtime-beweringen , worden statische beweringen tijdens het compileren gecontroleerd en worden ze ook afgedwongen bij het compileren van geoptimaliseerde builds.

static_assert

Beweringen betekenen dat een voorwaarde moet worden gecontroleerd en als deze onwaar is, is dit een fout. Voor static_assert() wordt dit tijdens het compileren gedaan.

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

Een static_assert() heeft een verplichte eerste parameter, de voorwaarde, dat is een bool constexpr. Het kan een tweede parameter hebben, het bericht, dat is een letterlijke tekenreeks. Vanaf C ++ 17 is de tweede parameter optioneel; daarvoor is het verplicht.

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

Het wordt gebruikt wanneer:

  • Over het algemeen is een verificatie tijdens het compileren vereist voor een bepaald type op constexpr-waarde
  • Een sjabloonfunctie moet bepaalde eigenschappen van een doorgegeven type verifiëren
  • Men wil testcases schrijven voor:
    • sjabloon metafuncties
    • constexpr-functies
    • macro metaprogrammering
  • Bepaalde definities zijn vereist (bijvoorbeeld de C ++ -versie)
  • Portering oudere code, beweringen over sizeof(T) (bijv. 32-bit int)
  • Bepaalde compilerfuncties zijn vereist om het programma te laten werken (verpakken, lege basisklasse-optimalisatie, etc.)

Merk op dat static_assert() niet deelneemt aan SFINAE : dus, wanneer extra overbelastingen / specialisaties mogelijk zijn, moet men het niet gebruiken in plaats van metaprogrammeringstechnieken voor std::enable_if<> (zoals std::enable_if<> ). Het kan in sjablooncode worden gebruikt wanneer de verwachte overbelasting / specialisatie al is gevonden, maar verdere verificaties zijn vereist. In dergelijke gevallen kan het meer concrete foutmelding (en) geven dan hiervoor op SFINAE te vertrouwen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow