static_cast(Base pointer) 是否应该给出编译时错误?
class A
{
public:
A()
{
}
};
class B : public A
{
public:
B()
{
}
};
int main()
{
A *a=new A();
B * b=static_cast<B*>(a); // Compile Error?
}
最佳答案
它不会给出编译时错误,因为 Base-Derived 关系 可以在运行时存在,具体取决于被强制转换的指针的地址。
static_cast
总是成功,但如果你不转换为正确的类型,则会引发 undefined-behavior。 dynamic_cast
可能会失败,实际上会告诉您是否尝试转换为正确的类型。
所以在我看来,static_cast
应该用于downcast,前提是设计可以确定存在这种可能性。 CRTP 就是一个很好的例子。 .所以在某些情况下这是合乎逻辑的,但尽量避免它,因为它是未定义的行为。
static_cast
不需要 RTTI,这可能会使它理论上更快,但我会随时以 dynamic_cast
换取未定义的行为static_cast
可能会导致!
关于c++ - static_cast<Derived *>(Base pointer) 是否应该给出编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469013/