# V771. The '?:' operator uses constants from different enums.

Анализатор обнаружил потенциально возможную ошибку в коде, связанную с тем, что в тернарном операторе '?:' в качестве второго и третьего операндов используются константные значения из разных перечислений.

Рассмотрим пример такого кода:

    enum OnlyOdd { Not_Odd, Odd };
    enum OnlyEven { Not_Even, Even };

    int isEven(int a)
    {
      return (a % 2) == 0 ? Even : Odd;
    }

Функция проверяет число на четность, но в возвращающемся значении используются константы из двух разных перечислений (OnlyEven::Even и OnlyOdd::Odd), приводимые к типу 'int'. В результате, независимо от переданного аргумента 'a', функция всегда будет возвращать 1 (истину). Корректный код должен выглядеть следующим образом:

    enum OnlyOdd { Not_Odd, Odd };
    enum OnlyEven { Not_Even, Even };

    int isEven(int a)
    {
      return (a % 2) == 0 ? Even : Not_Even;
    }

Примечание. Нормальной ситуацией считается применение двух разных перечислений без имени, например:

    enum
    {
      FLAG_FIRST = 0x01 << 0,
      FLAG_SECOND = 0x01 << 1,
      ....
    };

    enum
    {
      FLAG_RW = FLAG_FIRST | FLAG_SECOND,
      ....
    };

    ....
    bool condition = ...;
    int foo = condition ? FLAG_SECOND : FLAG_RW; // нет V771
    ....