mentre sfogliando il codice sorgente di Qt mi sono imbattuto in questo gioiello:Bizzarro trucco statico_cast?
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;
}
Avviso il static_cast<T>(0)->Type
? Sto usando C++ da molti anni ma non ho mai visto 0 essere usato in un static_cast prima. Che cosa sta facendo questo codice ed è sicuro?
Background: Se derivare da QGraphicsItem
che sono destinati a dichiarare un valore di enumerazione unico chiamato Type
che e implementare una funzione virtuale chiamato type
che restituisce, ad esempio:
class Item : public QGraphicsItem
{
public:
enum { Type = MAGIC_NUMBER };
int type() const { return Type; }
...
};
È quindi possibile fare questo:
QGraphicsItem* item = new Item;
...
Item* derivedItem = qgraphicsitem_cast<Item*>(item);
Questo probabilmente aiuterà a spiegare cosa sta provando a fare questo static_cast.
Ancora una volta, prova la tua affermazione che si tratta di "comportamento tecnicamente non definito". Vedi: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 – p00ya
@ p00ya: Questo è un difetto _active_. La sua proposta di risoluzione non è stata concordata e non è stata incorporata nella prossima bozza del comitato finale del C++ 0x. Indirizzare attraverso un puntatore nullo (o dereferenziare un puntatore nullo - fai la tua scelta) porta a un comportamento indefinito. –
L'ultima volta che ho letto ci sono alcune sottigliezze e il dibattito sul fatto che il puntatore sia dereferenziato o meno (per esempio se '& * ((int *) 0)' non è definito a causa della apparente dereferenziazione, anche se potrebbe essere saltato - o chiamare una funzione membro statica attraverso un puntatore di istanza nullo, che è più simile a ciò che sta accadendo nella domanda). IMO gli avvocati della lingua possono capirlo e noi mortali possiamo scrivere un codice che non assomiglia ai dereferences null pointers :) – AshleysBrain