Неправильно ли используется static_cast?

У меня смешанные чувства по поводу 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 , неявного преобразования будет достаточно.

14
задан Community 23 May 2017 в 10:34
поделиться