Компилятор не помечает неверное возвращаемое значение для 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() метод, aInvokeEventHandler всегда будет true независимо от того, прошел ли я false,

Мне потребовался напарник, чтобы показать мне, что false значение должно быть во внутренних скобках на return линия, вот так:

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

Как только я увидел это, я ударил себя ногой. Обнаружение этого было очевидно затруднено, потому что оригинальный кодер использовал избыточные внешние скобки на return линия.

Мой вопрос: почему компилятор не подобрал это для меня?

Мой метод возвращает HRESULTТем не менее в приведенном выше исходном коде я явно возвращаю составной набор значений в скобках, то есть:

(HRESULT, bool)

Является ли обозначение, подобное этому, приемлемым в стандартах C/C++, и если да, то какова будет цель такого разрешения? Или это ошибка в компиляторе?

4 ответа

Решение

Вы страдаете от оператора запятой, который оценивает и отбрасывает значение своего левого операнда, а затем оценивает его правый операнд как значение выражения.

Кроме того, значение по умолчанию для аргумента ProcessEvent является причиной того, что ваш вызов с одним аргументом был приемлемым.

Что вы написали:

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

Что это значит (примерно):

bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;

Запятая на самом деле является действительным оператором - см. Этот пост.

Проблема, которую вы видите, заключается в двух вещах.

  1. Оператор запятой отбрасывает значение на левой стороне и возвращает только значение на правой стороне (fasle)

  2. HRESULT - это просто длинное значение, и поэтому существует неявное преобразование значения false в HRESULT, таким образом, нет ошибки компилятора.

Другие вопросы по тегам