我正在从文档http://doc.qt.io/qt-5/statemachine-api.html看这个Qt的示例:
bool eventTest(QEvent *e) override
{
if (e->type() != QEvent::Type(QEvent::User+1)) // StringEvent
return false;
StringEvent *se = static_cast<StringEvent*>(e);
return (m_value == se->value);
}
但是在这一行:
e->type() != QEvent::Type(QEvent::User+1)
我不明白这里是否需要显式强制转换,即enum Event::Type
的整数值,因为以下内容也可以工作:
e->type() != QEvent::User+1 // no explicit cast
那么使用显式强制转换更好,为什么?
谢谢。
答案 0 :(得分:1)
QEvent::User + 1
的类型为int
。当然,将结果转换为QEvent::Type
会将其转换为QEvent::Type
,而我猜那是它的原始类型以及e->Type()
的类型。
您是对的,尽管原因不那么直接,但是不需要强制转换。在e->Type() == QEvent::User + 1
中,右侧的类型为int
,因此左侧被提升为int
,并且在int
值上进行比较。通常,这完全可以。自远古以来就是使用enums
的方式。在我看来,这种投射就像将形式主义推向现实。有些人喜欢这样做。
答案 1 :(得分:0)
摘自enum的在线文档
尽管可以使用
static_cast
来获取枚举器的数值,但没有从范围内的枚举器的值到整数类型的隐式转换。
所以,是的,您需要对此类转换进行显式转换。
但是,即使QEvent::Type
不是有作用域的枚举并允许隐式转换,static_cast
也是实现它的好方法。
请阅读以下常见问题解答:What good is static_cast?