2012-06-28 6 views
5

Observé que las aserciones estáticas en las plantillas de clase no se activan cuando las instancias son typedef 'ed.¿Debería activarse static_assert con un typedef?

#include <type_traits> 

template <typename T> 
struct test_assert 
{ 
    static_assert(std::is_same< T, int >::value, "should fail"); 
}; 

typedef test_assert<float> t; 

Este código se compila sin error. Si trato de crear una instancia, entonces la aserción falla:

t obj; // error: static assertion failed: "should fail" 

Por último, si se sustituye la condición con false, la afirmación falla, incluso si no una instancia de la plantilla de clase:

template <typename T> 
struct test_assert 
{ 
    static_assert(false, "always fails"); 
}; 

Probé este código en gcc-4.5.1 y gcc-4.7.0. ¿Es este comportamiento normal? ¿A qué hora se supone que el compilador verifica las aserciones estáticas? Supongo que la búsqueda en dos fases está involucrada, pero ¿no debería el typedef desencadenar la segunda fase?

+0

+1. Gran pregunta :-) – Nawaz

Respuesta

9

He intentado este código en gcc-4.5.1 y gcc-4.7.0. ¿Es este comportamiento normal?

A qué hora se supone que el compilador para verificar las afirmaciones estáticas?

Esta es una pregunta interesante. Durante la creación de instancias, que será la primera fase de búsqueda de nombres no dependientes y la segunda fase de búsqueda para afirmar que dependen de los argumentos de la plantilla.

conjetura de búsqueda de dos fases está involucrado, pero no debe el gatillo typedef la segunda fase?

Las plantillas se compilan a pedido, el typedef solo crea un alias para la plantilla y no desencadena la creación de instancias. Considere el siguiente código:

template <typename T> class unique_ptr; 
typedef unique_ptr<int> int_unique_ptr; 

La plantilla sólo se declara, pero eso es suficiente para que el typedef, ya que sólo se genera un alias para el tipo. Por otro lado, si crea un objeto del tipo, entonces la plantilla debe ser instanciada (de nuevo bajo demanda, las funciones miembro no se crearán instancias).

+0

Gracias, esto es lo que pensé. Me sorprendió porque nunca lo noté en varios meses de metaprogramación de plantillas. De hecho, en TMP, 'typedef' usualmente accede a un tipo anidado, lo que desencadena la creación de instancias. –

+0

+1 ¡Gran respuesta! – Nawaz