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

The analyzer detected a possible error that has to do with the ternary operator '?:' using constants from different enumerations as its second and third operands.

Consider the following example:

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

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

This function checks if the number passed as an argument is even, but its return value is evaluated using constants from two different enums (OnlyEven::Even and OnlyOdd::Odd) cast to 'int'. This mistake will cause the function to return 1 (true) all the time regardless of the 'a' argument's actual value. This is what the fixed code should look like:

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

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

Note. Using two different unnamed enumerations is considered a normal practice, for example:

    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; // no V771
    ....