[英]Compiler not flagging incorrect return value for HRESULT
我只花了太长的方式试图找出原因,在下面的代码片段中, ProcessEvent()
方法似乎忽略了false
我通过在价值aInvokeEventHandler
:
HRESULT
CEventManager::
Process(Event anEvent)
{
return (m_pPool->GetFsm()->ProcessEvent(anEvent), false);
}
// Definition of ProcessEvent()
HRESULT ProcessEvent(const Event& anEvent, bool aInvokeEventHandler = true);
每当我中断ProcessEvent()
方法时,无论我是否传入false
, aInvokeEventHandler
始终为true
。
一个工作人员向我指出, false
值应该在return
行的内部括号内,如下所示:
return m_pPool->GetFsm()->ProcessEvent(anEvent, false); // Corrected code
一看到这个,我就踢自己。 显然,发现这一点变得更加困难,因为原始编码器在return
线上使用了多余的外部括号。
我的问题是,为什么编译器没有为我解决这个问题?
我的方法返回一个HRESULT
,但是在上面的原始代码中,我显然返回了括号中的一组复合值,即:
(HRESULT, bool)
这样的符号在C / C ++标准中是否可以接受,如果可以,允许这样做有什么目的? 还是这是编译器中的错误?
您正遭受逗号运算符的困扰,该运算符求值并丢弃其左操作数的值,然后将其右操作数作为表达式的值求值。
同样,ProcessEvent参数的默认值是为什么您接受一个参数的原因。
你写的是:
return (m_pPool->GetFsm()->ProcessEvent(anEvent), false);
这意味着什么(大致):
bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;
逗号实际上是有效的运算符-请参阅这篇文章 。
您看到的问题有两点。
逗号运算符正在丢弃左侧的值,而仅返回右侧的值(fasle)
HRESULT只是一个长值,因此将false值隐式转换为HRESULT,因此没有编译器错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.