0

我只是花了长时间试图诊断为什么,在下面的代码片段中,该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总是会。truefalse

一位同事向我指出,该false值应该在该行的括号内return,如下所示:

return m_pPool->GetFsm()->ProcessEvent(anEvent, false); // Corrected code

我一看到这个,就踢了自己一脚。发现这一点显然变得更加困难,因为原始编码器在行上使用了多余的括号return

我的问题是,为什么编译器没有为我选择这个?

我的方法返回 a HRESULT,但在上面的原始代码中,我显然在括号中返回了一组复合值,即:

(HRESULT, bool)

这样的符号在 C/C++ 标准中是否可以接受,如果可以,允许这样做的目的是什么?或者这是编译器中的错误?

4

4 回答 4

1

您遇到了逗号运算符,它计算并丢弃其左侧操作数的值,然后将其右侧操作数计算为表达式的值。

此外,ProcessEvent 参数的默认值是您的单参数调用可以接受的原因。

于 2009-06-25T04:03:01.683 回答
1

你写的:

return (m_pPool->GetFsm()->ProcessEvent(anEvent), false);

这意味着什么(大致):

bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;
于 2009-06-25T04:04:38.517 回答
0

逗号实际上是一个有效的运算符 - 请参阅这篇文章

于 2009-06-25T04:04:01.433 回答
0

您看到的问题在于两件事。

  1. 逗号运算符丢弃左侧的值并仅返回右侧的值(fasle)

  2. HRESULT 只是一个 long 值,因此值 false 到 HRESULT 的隐式转换,因此没有编译器错误。

于 2009-06-25T04:28:48.803 回答