我对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
,隐式转换就足够了。