Domanda

Ho sentimenti contrastanti per static_cast, poiché è il cast C ++ più sicuro disponibile, ma consente conversioni sia sicure che non sicure allo stesso tempo, quindi devi conoscere il contesto per dire se è effettivamente sicuro o potrebbe portare a Ub (ad esempio quando si lancia su una sottoclasse ).

Allora perché non c'è un cast esplicito più sicuro? Ecco un esempio, dove potrebbe essere utile. In com, devono restituire il puntatore dell'interfaccia come void** ppv, quindi "devi" lanciare esplicitamente

*ppv = (IInterface*) this;

che è stato quindi suggerito di essere sostituito da un cast C ++ più sicuro

*ppv = static_cast<IInterface*>(this);

Ma ha senso fare anche un static_cast qui? this è di una classe che deriva da IInterface, quindi si potrebbe semplicemente scrivere

IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;

o usa un aiutante come

template<class T, class U>
T implicit_cast(U p) { return p; }

*ppv = implicit_cast<IInterface*>(this);

Quindi, è vero static_cast a volte viene abusato e può (dovrebbe (dovrebbe) essere sostituito da questo implicit_cast In alcuni casi, o mi manca qualcosa?

EDIT: lo so È richiesto un cast in Com, ma non deve esserlo static_cast, un cast implicito sarebbe sufficiente.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top