Tengo sentimientos encontrados acerca de static_cast
, ya que es el yeso de C++ más seguro disponible, pero permite conversiones seguras e inseguras al mismo tiempo, por lo que debe conocer el contexto para decir si es seguro o podría conducir a UB (por ejemplo, cuando se lanza a una subclase).¿Está mal usado static_cast?
¿Por qué no hay un reparto explícito más seguro? Aquí hay un ejemplo donde podría ser útil. En COM, tienen que devolver el puntero de interfaz como void** ppv
, por lo que "tiene que" echar explícitamente
*ppv = (IInterface*) this;
que luego fue sugerido para ser sustituido por un C más seguro ++ fundido
*ppv = static_cast<IInterface*>(this);
Pero ¿tiene sentido para hacer incluso un static_cast
aquí? this
es de una clase que deriva de IInterface
, por lo que uno puede simplemente escribir
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
o utilizar un ayudante como
template<class T, class U>
T implicit_cast(U p) { return p; }
*ppv = implicit_cast<IInterface*>(this);
Por lo tanto, es cierto que static_cast
a veces se utiliza y puede (debe?) ser reemplazado por este implicit_cast
en algunos casos, o me falta algo?
EDIT: Sé que a cast is required in COM, pero no tiene que ser static_cast
, un molde implícito sería suficiente.
Nota: Ver http://stackoverflow.com/a/869597 por el "derecho" de la aplicación 'implicit_cast' (y una buena explicación). –