У меня смешанные чувства по поводу static_cast
, поскольку это самый безопасный C ++ cast доступен, но допускает как безопасные, так и небезопасные преобразования одновременно, поэтому вы должны знать контекст, чтобы сказать, действительно ли он безопасен или может привести к UB (например, при преобразовании в подкласс).
Так почему же нет более безопасного явного приведения? Вот пример, где это может быть полезно. В COM они должны возвращать указатель интерфейса как void ** ppv
, поэтому «нужно» явно приводить
*ppv = (IInterface*) this;
, которое затем предлагалось заменить более безопасным приведением C ++
*ppv = static_cast(this);
Но разве имеет смысл сделать здесь даже static_cast
? this
относится к классу, производному от IInterface
, поэтому можно просто написать
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
или использовать помощник, например
template
T implicit_cast(U p) { return p; }
*ppv = implicit_cast(this);
Итак, правда ли, что static_cast
иногда используется неправильно и может (должен?) быть заменен этим implicit_cast
в некоторых случаях, или я что-то упускаю?
РЕДАКТИРОВАТЬ: Я знаю, что требуется приведение в COM ], но не обязательно static_cast
, неявного преобразования будет достаточно.