2012-06-28 1 views
5

Ho notato che le asserzioni statiche nei modelli di classe non vengono attivate quando le istanze sono typedef 'ed.Dovrebbe essere attivato static_assert con 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; 

Questo codice viene compilato senza errori. Se provo a creare un'istanza, quindi l'asserzione fallisce:

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

Infine, se sostituisco la condizione con false, l'asserzione non riesce, anche se non un'istanza della classe template:

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

Ho provato questo codice su gcc-4.5.1 e gcc-4.7.0. Questo comportamento è normale? A che ora il compilatore dovrebbe verificare asserzioni statiche? Immagino che la ricerca in due fasi sia coinvolta, ma il typedef non dovrebbe innescare la seconda fase?

+0

+1. Grande domanda. :-) – Nawaz

risposta

9

Ho provato questo codice su gcc-4.5.1 e gcc-4.7.0. Questo comportamento è normale?

A che ora è il compilatore suppone per verificare le asserzioni statici?

Questa è una domanda interessante. Durante l'istanziazione, che sarà la ricerca di prima fase per i nomi non dipendenti e la seconda fase di ricerca per gli asseriti che dipendono dagli argomenti del modello.

indovinare la ricerca in due fasi è coinvolta, ma non dovrebbe il trigger typedef la seconda fase?

I modelli sono compilati su richiesta, il typedef crea semplicemente un alias per il modello e non attiva l'istanziazione. Si consideri il seguente codice:

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

Il modello è dichiarato solo, ma che è sufficiente per il typedef, in quanto genera solo alias per il tipo. D'altra parte, se si crea un oggetto del tipo, il modello deve essere istanziato (sempre su richiesta, le funzioni membro non verranno istanziate).

+0

Grazie, questo è quello che pensavo. Sono rimasto sorpreso perché non l'ho mai notato in diversi mesi di metaprogrammazione del modello. Infatti, in TMP, 'typedef's di solito accede a un tipo annidato, attivando l'istanza. –

+0

+1 Ottima risposta! – Nawaz