我对 的感觉很复杂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
,隐式强制转换就足够了。