C++
static_assert
Поиск…
Синтаксис
- 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 второй параметр является необязательным; до этого он является обязательным.
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 для этого.