Поиск…


Синтаксис

  • static_assert ( bool_constexpr , message )
  • static_assert ( bool_constexpr ) / * Поскольку C ++ 17 * /

параметры

параметр подробности
bool_constexpr Выражение для проверки
сообщение Сообщение для печати, когда bool_constexpr является ложным

замечания

В отличие от утверждений времени исполнения , статические утверждения проверяются во время компиляции и также применяются при компиляции оптимизированных сборок.

static_assert

Утверждения означают, что условие должно быть проверено, и если оно ложно, это ошибка. Для static_assert() это делается компиляцией.

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() есть обязательный первый параметр, условие - это bool constexpr. Он может иметь второй параметр, это сообщение, которое является строковым литералом. Из C ++ 17 второй параметр является необязательным; до этого он является обязательным.

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

Он используется, когда:

  • В общем случае проверка во время компиляции требуется для некоторого типа по значению constexpr
  • Функция шаблона должна проверять определенные свойства передаваемого им типа
  • Один хочет написать тестовые примеры:
    • шаблонные метафоры
    • функции constexpr
    • макропрограммирование макросов
  • Требуются определенные определения (например, версия на С ++)
  • Портирование устаревшего кода, утверждений о sizeof(T) (например, 32-битный int)
  • Для работы программы требуются определенные функции компилятора (упаковка, пустая оптимизация базового класса и т. Д.).

Обратите внимание, что static_assert() не участвует в SFINAE : таким образом, когда возможны дополнительные перегрузки / специализации, его нельзя использовать вместо методов метапрограммирования шаблонов (например, std::enable_if<> ). Он может использоваться в коде шаблона, когда ожидаемая перегрузка / специализация уже найдена, но необходимы дальнейшие проверки. В таких случаях он может предоставить более конкретные сообщения об ошибках, чем полагаться на SFINAE для этого.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow