mientras buscando el código fuente de Qt me encontré con esta joya:Bizarre static_cast truco?
template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
{
return int(static_cast<T>(0)->Type) == int(QGraphicsItem::Type)
|| (item && int(static_cast<T>(0)->Type) == item->type()) ? static_cast<T>(item) : 0;
}
Aviso del static_cast<T>(0)->Type
? He estado usando C++ durante muchos años, pero nunca antes había visto 0 en una transmisión estática. ¿Qué está haciendo este código y es seguro?
Antecedentes: Si que se derivan de QGraphicsItem
que están destinados a declarar un valor de enumeración único llamado Type
que e implementar una función virtual llamada type
que lo devuelve, por ejemplo:
class Item : public QGraphicsItem
{
public:
enum { Type = MAGIC_NUMBER };
int type() const { return Type; }
...
};
A continuación, puede hacer esto:
QGraphicsItem* item = new Item;
...
Item* derivedItem = qgraphicsitem_cast<Item*>(item);
Esto probablemente ayude a explicar lo que está tratando de hacer staticcast.
De nuevo, por favor, demuestre su afirmación de que se trata de un "comportamiento técnicamente indefinido". Ver: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 – p00ya
@ p00ya: Ese es un defecto_activo. Su resolución propuesta no ha sido acordada y no se ha incorporado al borrador final del comité final de C++ 0x. La indicación a través de un puntero nulo (o desreferenciando un puntero nulo - elija) da como resultado un comportamiento indefinido. –
Última vez que leí había algunas sutilezas y debate sobre si el puntero es desreferenciado o no (por ejemplo, si '& * ((int *) 0)' no está definido debido a la aparente desreferencia, aunque podría omitirse o llamarse una función de miembro estático a través de un puntero de instancia nulo, que se parece más a lo que está sucediendo en la pregunta). IMO el idioma que los abogados pueden descifrar y nosotros los mortales podemos escribir código que no parece que desreferencia punteros nulos :) – AshleysBrain