У меня смешанные чувства по поводу static_cast
, так как это самый безопасный листинг C++, но он позволяет одновременно безопасные и небезопасные конверсии, поэтому вы должны знать контекст, чтобы сказать, действительно ли он безопасен или может привести к UB (например, при сдаче подкласса).Не используется static_cast?
Так почему же нет более безопасного явного литья? Вот пример, где это может быть полезно. В COM, они должны вернуть указатель на интерфейс, как void** ppv
, так что «должны» бросить явно
*ppv = (IInterface*) this;
, который затем было предложено заменить на более безопасный C++ отбрасываемой
*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: Я знаю, что a cast is required in COM, но это не обязательно должно быть static_cast
, неявного броска будет достаточно.
Примечание: См http://stackoverflow.com/a/869597 для "правильной" реализации 'implicit_cast' (и хороший объяснение). –