Mam mieszane uczucia na temat static_cast
, ponieważ jest to najbezpieczniejsza dostępna wersja C++, ale umożliwia jednocześnie bezpieczną i niebezpieczną konwersję, więc musisz znać kontekst, aby powiedzieć, czy jest rzeczywiście bezpieczny lub może prowadzić do UB (np. podczas rzucania do podklasy).Czy static_cast jest niewłaściwie używany?
Dlaczego więc nie ma bezpieczniejszej, wyraźnej obsady? Oto przykład, w którym może być przydatny. W COM, muszą powrócić wskaźnik interfejsu jako void** ppv
, więc „trzeba” rzucić jawnie
*ppv = (IInterface*) this;
który następnie zasugerował, aby zostać zastąpione przez bezpieczniejsze C++ oddanych
*ppv = static_cast<IInterface*>(this);
Ale to robi ma sens, by zrobić tutaj nawet static_cast
? this
ma klasy, która wywodzi się od IInterface
, więc można po prostu napisać
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
lub użyć pomocnika jak
template<class T, class U>
T implicit_cast(U p) { return p; }
*ppv = implicit_cast<IInterface*>(this);
tak, czy to prawda, że static_cast
bywa nadużywane i może (powinien?) być zastąpiony przez ten implicit_cast
w niektórych przypadkach, czy coś mi brakuje?
EDYCJA: Wiem, że a cast is required in COM, ale nie musi to być static_cast
, wystarczy niejawny rzut.
Uwaga: Patrz http://stackoverflow.com/a/869597 za "prawo" realizacji 'implicit_cast' (i ładnym wyjaśnieniem). –