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