Ho sentimenti contrastanti su static_cast
, poiché è il cast di C++ più sicuro disponibile, ma consente allo stesso tempo conversioni sicure e non sicure, quindi devi conoscere il contesto per dire se è effettivamente sicuro o potrebbe portare a UB (ad es. quando si esegue il casting in una sottoclasse).Viene utilizzato in modo statico_cast?
Quindi perché non c'è un cast esplicito più sicuro? Ecco un esempio, dove potrebbe essere utile. In COM, devono restituire il puntatore di interfaccia come void** ppv
, in modo da "avere a" lanciare esplicitamente
*ppv = (IInterface*) this;
che è stato poi suggerito per essere sostituito da un C più sicuro ++ gettato
*ppv = static_cast<IInterface*>(this);
Ma ha senso di fare anche un static_cast
qui? this
è di una classe che deriva da IInterface
, e quindi si può semplicemente scrivere
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
o utilizzare un aiutante come
template<class T, class U>
T implicit_cast(U p) { return p; }
*ppv = implicit_cast<IInterface*>(this);
Quindi, è vero che static_cast
è a volte usi promiscui e può (dovrebbe?) essere sostituito da questo implicit_cast
in alcuni casi, o mi manca qualcosa?
EDIT: So che a cast is required in COM, ma non deve essere static_cast
, un cast implicito sarebbe sufficiente.
Nota: vedere http://stackoverflow.com/a/869597 per l'attuazione "diritto" di 'implicit_cast' (e una bella spiegazione). –