У меня смешанные чувства по поводу 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
в некоторых случаях, или я что-то упускаю?
РЕДАКТИРОВАТЬ: я знаю, что a Приведение требуется в COM, но не обязательно static_cast
, достаточно неявного приведения.
implicit_cast
(и хорошего объяснения). - person gx_   schedule 21.10.2013