C++
static_assert
Buscar..
Sintaxis
- static_assert ( bool_constexpr , mensaje )
- static_assert ( bool_constexpr ) / * Desde C ++ 17 * /
Parámetros
Parámetro | Detalles |
---|---|
bool_constexpr | Expresión para comprobar |
mensaje | Mensaje para imprimir cuando bool_constexpr es falso |
Observaciones
A diferencia de las aserciones en tiempo de ejecución , las aserciones estáticas se verifican en tiempo de compilación y también se aplican cuando se compilan construcciones optimizadas.
static_assert
Las afirmaciones significan que una condición debe ser verificada y si es falsa, es un error. Para static_assert()
, esto se hace en tiempo de compilación.
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);
}
Un static_assert()
tiene un primer parámetro obligatorio, la condición, que es un bex constexpr. Puede tener un segundo parámetro, el mensaje, que es una cadena literal. Desde C ++ 17, el segundo parámetro es opcional; antes de eso, es obligatorio.
template<typename T>
T mul10(const T t)
{
static_assert(std::is_integral<T>::value);
return (t << 3) + (t << 1);
}
Se utiliza cuando:
- En general, se requiere una verificación en tiempo de compilación en algún tipo en constexpr value
- Una función de plantilla necesita verificar ciertas propiedades de un tipo que se le pasa
- Uno quiere escribir casos de prueba para:
- plantilla de metafunciones
- funciones constexpr
- macro metaprogramacion
- Se requieren ciertas definiciones (por ejemplo, versión C ++)
- Código legado de portabilidad, afirmaciones sobre
sizeof(T)
(p. Ej., Int. De 32 bits) - Se requieren ciertas funciones del compilador para que el programa funcione (empaquetamiento, optimización de clase base vacía, etc.)
Tenga en cuenta que static_assert()
no participa en SFINAE : por lo tanto, cuando son posibles sobrecargas / especializaciones adicionales, no se debe usar en lugar de técnicas de metaprogramación de plantillas (como std::enable_if<>
). Puede usarse en el código de la plantilla cuando ya se encuentra la sobrecarga / especialización esperada, pero se requieren verificaciones adicionales. En tales casos, podría proporcionar mensajes de error más concretos que confiar en SFINAE para esto.