C++
static_assert
Szukaj…
Składnia
- static_assert ( bool_constexpr , komunikat )
- static_assert ( bool_constexpr ) / * Od C ++ 17 * /
Parametry
Parametr | Detale |
---|---|
bool_constexpr | Wyrażenie do sprawdzenia |
wiadomość | Wiadomość do wydrukowania, gdy bool_constexpr ma wartość false |
Uwagi
W przeciwieństwie do asercji środowiska wykonawczego, asercje statyczne są sprawdzane w czasie kompilacji, a także egzekwowane podczas kompilacji zoptymalizowanych kompilacji.
static_assert
Asercje oznaczają, że warunek powinien zostać sprawdzony, a jeśli jest fałszywy, oznacza to błąd. W przypadku static_assert()
jest to wykonywane podczas kompilacji.
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);
}
static_assert()
ma obowiązkowy pierwszy parametr, warunek, który jest constolpr bool. Może mieć drugi parametr, komunikat, czyli dosłowny ciąg znaków. Od C ++ 17 drugi parametr jest opcjonalny; wcześniej jest to obowiązkowe.
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
Jest używany, gdy:
- Ogólnie rzecz biorąc, weryfikacja w czasie kompilacji jest wymagana dla niektórych typów wartości constexpr
- Funkcja szablonu musi zweryfikować pewne właściwości przekazanego do niej typu
- Chcemy napisać przypadki testowe dla:
- metafunkcje szablonu
- funkcje constexpr
- metaprogramowanie makr
- Wymagane są pewne definicje (np. Wersja C ++)
- Przenoszenie starszego kodu, asercje na
sizeof(T)
(np. 32-bitowy int) - Niektóre funkcje kompilatora są wymagane do działania programu (pakowanie, optymalizacja pustej klasy podstawowej itp.)
Zauważ, że static_assert()
nie uczestniczy w SFINAE : dlatego, gdy możliwe są dodatkowe przeciążenia / specjalizacje, nie należy go używać zamiast technik metaprogramowania szablonów (takich jak std::enable_if<>
). Można go użyć w kodzie szablonu, gdy oczekiwane przeciążenie / specjalizacja jest już znalezione, ale wymagane są dalsze weryfikacje. W takich przypadkach może dostarczyć bardziej konkretnych komunikatów o błędach niż poleganie na SFINAE.