【发布时间】:2011-02-10 13:37:11
【问题描述】:
我对@987654323@ 有复杂的感觉,因为它是可用的最安全的 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 cast is required in COM,但不一定是static_cast,隐式转换就足够了。
【问题讨论】:
-
注意:请参阅 stackoverflow.com/a/869597 以了解
implicit_cast的“正确”实现(以及一个很好的解释)。
标签: c++ casting type-safety static-cast