static_assert
Comprueba una aserción de software en tiempo de compilación. Si la expresión constante especificada es false
, el compilador muestra el mensaje especificado, si se produce uno, y se produce un error C2338 en la compilación; de lo contrario, la declaración no tiene ningún efecto.
Sintaxis
static_assert( constant-expression, string-literal );
static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)
Parámetros
constant-expression
Una expresión constante entera que se puede convertir en un valor booleano. Si la expresión evaluada es cero (false), aparecerá el parámetro string-literal y se producirá un error de compilación. Si la expresión es distinta de cero (true), la declaración static_assert
no tiene ningún efecto.
string-literal
Mensaje que se muestra si el parámetro constant-expression es cero. El mensaje es una cadena de caracteres del juego de caracteres base del compilador; es decir, no de caracteres anchos o multibyte.
Comentarios
El parámetro constant-expression de una declaración static_assert
representa una aserción de software. Una aserción de software especifica una condición que se espera que sea cierta (valor true) en un determinado punto del programa. Si la condición es true, la declaración static_assert
no tiene ningún efecto. Si la condición es false, se produce un error en la aserción, el compilador muestra el mensaje en el parámetro string-literal y se produce un error de compilación. En Visual Studio 2017 y versiones posteriores, el parámetro string-literal es opcional.
La declaración static_assert
comprueba una aserción de software en tiempo de compilación. Por el contrario, las funciones assert Macro y _assert y _wassert prueban una aserción de software en tiempo de ejecución e incurren en un costo en tiempo de ejecución. La declaración static_assert
resulta especialmente útil para depurar plantillas, porque los argumentos de plantilla se pueden incluir en el parámetro constant-expression.
El compilador examina si hay errores de sintaxis en la declaración static_assert
al encontrar dicha declaración. El compilador evalúa el parámetro constant-expression inmediatamente si este no depende de un parámetro de plantilla. De lo contrario, el compilador evalúa el parámetro constant-expression cuando se crea una instancia 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 usar la palabra clave static_assert
en el ámbito de espacio de nombres, clase o ámbito de bloque. (La palabra clave static_assert
es técnicamente una declaración, aunque no introduce un nuevo nombre en el programa, porque se puede utilizar en el ámbito de espacio de nombres).
Descripción de static_assert
con ámbito de espacio de nombres
En el ejemplo siguiente, la declaración static_assert
tiene ámbito de espacio de nombres. Dado que el compilador conoce el tamaño del tipo void *
, la expresión se evalúa inmediatamente.
Ejemplo: static_assert
con ámbito de espacio de nombres
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Descripción de static_assert
con ámbito de clase
En el ejemplo siguiente, la declaración static_assert
tiene ámbito de clase. static_assert
comprueba si un parámetro de plantilla es de un tipo Plan Old Data (POD). El compilador examina la declaración static_assert
cuando se declara, pero no evalúa el parámetro constant-expression hasta que se crean instancias de la plantilla de clase basic_string
en main()
.
Ejemplo: static_assert
con ámbito de clase
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(std::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 de static_assert
con ámbito de bloque
En el ejemplo siguiente, la declaración static_assert
tiene ámbito de bloque. static_assert
comprueba que el tamaño de la estructura de VMPage sea igual al valor pagesize de la memoria virtual del sistema.
Ejemplo: static_assert
en el ámbito de bloque
#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.");
// ...
}
// ...
};
Consulte también
Aserción y mensajes proporcionados por el usuario (C++)
#error (directiva) (C/C++)
assert Macro, _assert, _wassert
Templates (Plantillas [C++])
Juego de caracteres ASCII
Declaraciones y definiciones