Компилятор не помечает неверное возвращаемое значение для 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;
Запятая на самом деле является действительным оператором - см. Этот пост.
Проблема, которую вы видите, заключается в двух вещах.
Оператор запятой отбрасывает значение на левой стороне и возвращает только значение на правой стороне (fasle)
HRESULT - это просто длинное значение, и поэтому существует неявное преобразование значения false в HRESULT, таким образом, нет ошибки компилятора.