У меня смешанные чувства по поводу static_cast
, так как это самый безопасный листинг С++, но он позволяет одновременно безопасные и небезопасные конверсии, поэтому вы должны знать контекст, чтобы сказать, действительно ли он безопасен или может привести к UB (например, при передаче в подкласс).
Так почему же нет более безопасного явного броска? Вот пример, где это может быть полезно. В COM они должны вернуть указатель интерфейса как void** ppv
, поэтому "нужно" явно указать
*ppv = (IInterface*) this;
который затем предложил заменить более безопасным С++-литом
*ppv = static_cast<IInterface*>(this);
Но имеет ли смысл сделать даже static_cast
здесь? this
имеет класс, который получается из IInterface
, поэтому можно просто написать
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
или используйте вспомогательный помощник, например
template<class T, class U>
T implicit_cast(U p) { return p; }
*ppv = implicit_cast<IInterface*>(this);
Итак, верно ли, что static_cast
иногда используется неправильно и может (должно быть?) быть заменено этим implicit_cast
в некоторых случаях, или я что-то не хватает?
EDIT: Я знаю, что требуется актерский состав в COM, но он не должен быть static_cast
, неявного броска будет достаточно.