我只花了方式太长时间试图诊断原因,在下面的代码片段中,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()
方法时,aInvokeEventHandler
始终为true
,无论我是否传入false
。
有一位同事向我指出false
值应该在return
行的内部括号内,如下所示:
return m_pPool->GetFsm()->ProcessEvent(anEvent, false); // Corrected code
一看到这个,我就踢了自己。发现这显然更难,因为原始编码器在return
行使用了冗余的外部括号。
我的问题是,为什么编译器没有为我选择这个?
我的方法返回HRESULT
,但在上面的原始代码中,我显然在括号中返回一组复合值,即:
(HRESULT, bool)
这样的符号在C / C ++标准中是否可以接受,如果是这样,那么允许这样做的目的是什么?或者这是编译器中的错误?
答案 0 :(得分:1)
您正在使用逗号运算符,该运算符计算并丢弃其左侧操作数的值,然后将其右侧操作数计算为表达式的值。
此外,ProcessEvent参数的默认值是您的单参数调用可接受的原因。
答案 1 :(得分:1)
你写的是什么:
return (m_pPool->GetFsm()->ProcessEvent(anEvent), false);
意味着什么(粗略地):
bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;
答案 2 :(得分:0)
逗号实际上是一个有效的运算符 - 请参阅this post。
答案 3 :(得分:0)
你看到的问题在于两件事。
逗号运算符正在丢弃 左边的值和 仅返回右侧值 (FASLE)
HRESULT只是一个很长的值,因此有一个 隐含的价值转换 错误到HRESULT,因此没有编译器 错误。