assert
Prueba una aserción de software en tiempo de compilación.Si la expresión constante especificada es false, el compilador muestra el mensaje especificado y la compilación emite un error; si no, la declaración no tiene ningún efecto.
static_assert(
constant-expression,
string-literal
);
Parámetros
Parámetro |
Descripción |
---|---|
constant-expression |
Una expresión constante entera que se puede convertir en un valor booleano. Si la expresión evaluada es cero (false), se muestra el parámetro de string-literal y los errores de compilación con un error.Si la expresión es distinto de cero (true), la declaración de static_assert no tiene ningún efecto. |
string-literal |
Se muestra un mensaje que si el parámetro de constant-expression es cero.El mensaje es una cadena de caracteres en conjunto de caracteres base el compilador; es decir, no multibyte o caracteres anchos. |
Comentarios
El parámetro de constant-expression de una declaración de static_assert representa una aserción de software.Una aserción de software especifica una condición que se espera que sea true en un punto determinado en el programa.Si la condición es true, la declaración de static_assert no tiene ningún efecto.Si la condición es false, la aserción, el compilador muestra el mensaje en el parámetro de string-literal , y se produce un error de compilación con un error.
La declaración de static_assert comprueba una aserción de software en tiempo de compilación.En cambio, la macro de assert (CRT) comprueba una aserción de software en tiempo de ejecución e incurre en un costo de tiempo de ejecución en espacio o tiempo.La declaración de static_assert es especialmente útil para depurar plantillas porque los argumentos de plantilla se pueden incluir en el parámetro de constant-expression .
el compilador examina la declaración de static_assert para los errores de sintaxis cuando se encuentra la declaración.El compilador evalúa el parámetro de constant-expression inmediatamente si no depende de un parámetro de plantilla.Si no, el compilador evalúa el parámetro de constant-expression cuando se crean instancias de la plantilla.Por consiguiente, el compilador puede emitir un mensaje de diagnóstico una vez cuando se encuentra la declaración, y otra vez cuando se crea una instancia de la plantilla.
Puede utilizar la palabra clave de static_assert en el espacio de nombres, la clase, o el ámbito del bloque.(Palabra clave de El static_assert es técnicamente una declaración, aunque no presenta nuevo nombre en el programa, porque se puede utilizar en el ámbito de espacio de nombres).
Descripción
En el ejemplo siguiente, la declaración de static_assert tiene ámbito de espacio de nombres.Dado que el compilador conoce el tamaño de void *tipo, la expresión se evalúa inmediatamente.
Ejemplo
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Descripción
En el ejemplo siguiente, la declaración de static_assert tiene ámbito de clase.static_assert comprueba que un parámetro de plantilla es un tipo de datos antiguos (POD) sin formato.El compilador examina la declaración de static_assert cuando se declara, pero no evalúa el parámetro de constant-expression hasta que la plantilla de clase basic_string creado instancias en main().
Ejemplo
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(tr1::is_pod<CharT>::value,
"Template argument CharT must be a POD type in class template basic_string");
// ...
};
}
struct NonPOD {
NonPOD(const NonPOD &) {}
virtual ~NonPOD() {}
};
int main()
{
std::basic_string<char> bs;
}
Descripción
En el ejemplo siguiente, la declaración de static_assert ha bloqueado el ámbito.static_assert comprueba que el tamaño de la estructura de VMPage sea igual a memoria virtual pagesize del sistema.
Ejemplo
#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
struct VMPage { // ...
};
int check_pagesize() {
static_assert(sizeof(VMPage) == PAGESIZE,
"Struct VMPage must be the same size as a system virtual memory page.");
// ...
}
// ...
};
Vea también
Referencia
Aserción y mensajes Usuario-Proporcionados (C++)