Я испытываю смешанные чувства по поводу static_cast
, так как это самый безопасный из доступных C ++ бросков, но допускает как безопасные, так и небезопасные преобразования одновременно, поэтому вы должны знать контекст, чтобы сказать, действительно ли он безопасен или может привестив UB (например, при приведении к подклассу).
Так почему нет более безопасного явного приведения?Вот пример, где это может быть полезно.В 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
в некоторых случаях, или я что-то упускаю?
РЕДАКТИРОВАТЬ: я знаю, что требуется преобразование в COM , но это не обязательно должно быть static_cast
, неявного приведения будет достаточно.