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.

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



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow