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.

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



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow