2012-04-12 11 views
5

Duplicar posible:
When can typeid return different type_info instances for same type?impulso :: ninguna optimización typeid para C++ 11

Si cambio de la línea operand->type() == typeid(ValueType) abajo en &operand->type() == &typeid(ValueType), el código sigue funcionando con gcc y toma menos espacio en el ejecutable (y lo hizo durante muchos años), pero ¿el estándar C++ 11 ofrece alguna garantía de que esta optimización funcione en diferentes compiladores?

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

Eso es técnicamente una pregunta de C++ 03, y esta es C++ 11. Editando para que explícitamente no sea un duplicado (la respuesta sigue siendo correcta) – MSalters

Respuesta

5

No, no se garantiza. Esta aserción puede desencadenar:

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

Mientras que tomaría un compilador bastante estúpido para hacer que el fuego, que podría suceder. En la práctica, sólo se producirá un error cuando el jugador de TypeId están siendo comparados a través de límites de bibliotecas dinámicas:

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

Esto es casi seguro que desencadenar.

+1

encontró esta publicación, la afirmación podría dispararse en Windows, pero podría no en Linux: [link] (http://stackoverflow.com/questions/1819114/when- can-typeid-return-different-type-info-instances-for-same-type) – user1095108

+0

@ user1095108: Ah, duplicar después de todo. :) – GManNickG

+0

No del todo, las personas aún pueden hackear su any.hpp, si se vinculan estáticamente. – user1095108