2010-06-23 9 views

Respuesta

13
STATIC_ASSERT(true); 

significa de hecho

static_assert<true>(); 

que evalúa a nada. static_assert<true> es solo una estructura vacía sin miembros. static_assert<true>() crea un objeto de esa estructura y no lo almacena en ninguna parte.

Esto simplemente compila y no hace nada.

Por otro lado

STATIC_ASSERT(false); 

significa

static_assert<false>(); 

que da lugar a error de compilación. static_assert no tiene especialización para false. Entonces se usa una forma general. Pero la forma general se da de la siguiente manera:

template <bool> 
struct static_assert; 

que es solo una declaración de una estructura y no su definición. Por lo tanto, static_assert<false>() causa un error de compilación al tratar de crear un objeto de una estructura que no está definida.

+0

+1 Excelente explicación – fingerprint211b

2

Bueno, supongo que se trata de la especialización de plantillas. STATIC_ASSERT (verdadero) se compilará correctamente, porque hay una definición (no solo una declaración) de "static_assert < true>".

STATIC_ASSERT (falso) será rechazado por el compilador, porque solo hay una declaración para "static_assert < false>" y no hay definición.

Actualización: para el estudio visual, static_assert (verdadero) está bien, pero static_assert (falso) provoca el error: "error C2514: 'static_assert < __formal>': clase tiene constructores [con __formal = false]"

9

static_assert<true>(); hace que

template <> 
struct static_assert<true> {} 

plantilla struct especialización creación de objetos temporales está haciendo - una llamada al constructor y más tarde a un destructor que ambos serán eliminados de esperar por el optimizador, ya que no hacen nada. Como solo hay una especialización para true y no hay una versión genérica de la plantilla struct, todas las construcciones que se evalúan como static_assert<false>(); simplemente no se compilarán.

+0

Gracias por la explicación, yo también me encontré perdido en esta sintaxis. – PeterK

4

En la expresión

static_assert<true>(); 

desde static_assert<true> es un tipo, se llama al constructor de static_assert<true>. Como static_assert<true> está especializado en una estructura vacía, nada se verá afectado.


Sin embargo, en

static_assert<false>(); 

ya que no hay especialización para static_assert<false>, la definición genérica

template <bool> 
struct static_assert; 

se utilizará. Pero aquí, el tipo static_assert<B> es incompleto. Entonces, llamar al constructor de static_assert<B> dará como resultado un error de compilación.


Por lo tanto, esto se llama "afirman estática" como la declaración abortará la compilación si la expresión se evalúa como false, similar a la normal assert() function que matará el programa en tiempo de ejecución.

Cuestiones relacionadas