Компилятор не помечает неверное возвращаемое значение для HRESULT - PullRequest
0 голосов
/ 25 июня 2009

Я только что потратил путь слишком долго, пытаясь выяснить, почему в следующем фрагменте кода метод 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 ]

1 голос
/ 25 июня 2009

То, что вы написали:

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

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

bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;
1 голос
/ 25 июня 2009

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

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

0 голосов
/ 25 июня 2009

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

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

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

0 голосов
/ 25 июня 2009

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

...