是否可以为 CString 返回堆栈对象以及为什么 /GR 导致未定义的行为dynamic_cast

Is it ok to return a stack object for a CString and why /GR causes undefined behavior to dynamic_cast?

本文关键字:未定义 dynamic cast GR 为什么 返回 CString 堆栈 对象 是否      更新时间:2023-10-16

我有多态类,我想通过dynamic_cast<B>(A)转换对象,尽管使用编译器优化/GR,我收到一条消息,指出它可能会导致未定义的行为。我改用static_cast,但它不进行运行时检查,对我的类不安全。此外,从类返回堆栈CString对象是否有效?

CString CKingdomWar::GetTeamName( eUserTeam eTeam )
{
    if( eTeam == ELDAR )
        return CString( "Eldar" );
    else if( eTeam == ELWYN )
        return CString( "Elwyn" );
    else if( eTeam == NORGNAGON )
        return CString( "Norgnagon" );
    return CString( " " );
}

如前所述,您的 CString 是按值返回的,这不是问题。

关于静态/动态强制转换,您应该显示发出警告的特定代码。 如果正确使用dynamic_cast(即,在兼容类型之间转换指针或引用),通常不会收到此类警告。

如果要dynamic_cast<B>(A)工作,则 A 和 B 都应该是指向同一继承树中对象的指针或引用。 例如,如果您有:

class A {
    // ...
};
class B : public A {
    // ...
};
A* inst = new B;

dynamic_cast<B*>(inst)就没事了。 与参考文献相同。 如果inst不是 B 类型,则指针版本将返回 NULL,或者引用版本将引发异常。

但是,您不能这样做:

A inst;
B nonono = dynamic_cast<B>(inst);