2012-04-12 25 views
5

Eventuali duplicati:
When can typeid return different type_info instances for same type?boost :: alcuna ottimizzazione typeid per C++ 11

Se cambio la linea operand->type() == typeid(ValueType) basso nella &operand->type() == &typeid(ValueType), il codice funziona ancora con gcc e prende meno spazio nel file eseguibile (e lo ha fatto per molti anni), ma lo standard C++ 11 offre qualche garanzia, che questa ottimizzazione dovrebbe funzionare su diversi compilatori?

template<typename ValueType> 
ValueType * any_cast(any * operand) 
{ 
    return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME 
     std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0 
#else 
     operand->type() == typeid(ValueType) 
#endif 
     ? &static_cast<any::holder<ValueType> *>(operand->content)->held 
     : 0; 
} 
+0

Questa è tecnicamente una domanda C++ 03, e questa è C++ 11. Modifica per renderlo esplicitamente non un duplicato (la risposta è ancora corretta) – MSalters

risposta

5

No, non è garantito. Questa asserzione può scatenare:

assert(&typeid(int) == &typeid(int)); 

Mentre ci vorrebbe un compilatore abbastanza stupido per fare quel fuoco, potrebbe accadere. In pratica, sarà solo esito negativo quando TypeId di sono messi a confronto attraverso i confini librerie dinamiche:

assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2()); 

Questo sarà quasi certamente innescare.

+1

ha trovato questo post, l'assert potrebbe sparare in Windows, ma potrebbe non farlo in linux: [link] (http://stackoverflow.com/questions/1819114/when- can-typeid-return-different-type-info-istanze-per-stesso-tipo) – user1095108

+0

@ user1095108: Ah, dopotutto duplicato. :) – GManNickG

+0

Non completamente, le persone potrebbero ancora hackerare il proprio any.hpp, se si collegano staticamente. – user1095108

Problemi correlati