Защитный код после включения перечисления никогда не достигается

Я только что столкнулся с запутанной проблемой при попытке скомпилировать некоторый код с использованием g ++ 4.4.3.

Приведенный ниже код компилируется нормально, но вместо того, чтобы выполнить ожидаемое утверждение, когда я передаю «недопустимое» значение перечисления, функция просто возвращает 1. Что мне еще более странно, так это то, что когда я раскомментирую строки, относящиеся к значению перечисления E3 , все начинает работать должным образом.

Тот факт, что в блоке переключателей нет записи по умолчанию, является преднамеренным. Мы компилируем с параметром -Wall, чтобы получать предупреждения о необработанных значениях перечисления.

enum MyEnum
{
    E1,
    E2, 
    //E3
};

int doSomethingWithEnum(MyEnum myEnum)
{
    switch (myEnum)
    {
        case E1: return 1;
        case E2: return 2;
        //case E3: return 3;
    }

    assert(!"Should never get here");
    return -1;
}

int main(int argc, char **argv)
{
    // Should trigger assert, but actually returns 1
    int retVal =  doSomethingWithEnum(static_cast<MyEnum>(4));
    std::cout << "RetVal=" << retVal << std::endl;

    return 0;
}
12
задан hysj 30 December 2011 в 12:39
поделиться