1

Consider this code:

typedef enum Type1
{
    val11,
    val12
} Type1;

typedef enum Type2
{
    val21,
    val22
} Type2;

Type1 type1 = val11;
if ( type1 == val22 )
    std::cout << "foo";

Visual Studio 2015 does not issue any warning (even with /Wall). However type1 and val22 are not of the same type. Is that normal or is it a Visual Studio bug?

jpo38
  • 20,821
  • 10
  • 70
  • 151

1 Answers1

0

As far as I know, the compiler does not have obligation to issue a warning when comparing enumerations of different types. I could not find it in the standard. For classic enum types there exist implicit type conversion to int, so the resulting code is perfectly legal. Semantically it is often incorrect to compare enumerations of different types, so since C++ we have a scoped enumeration construction which does not allow implicit conversions. (See the code below).

#include <iostream>
using namespace std;

enum UE1 // This is an unscoped enumeration (since C)
{
    val11,
    val12
};

enum UE2 // This is an unscoped enumeration too
{
    val21, // have to use different names for enumeration constants
    val22
};

enum class SE1 // This is an scoped enumeration (since C++11)
{
    val1,
    val2
};

enum class SE2
{
    val1, // can use the same names for the constants
    val2  // because they are in the different scope
};

int main(int, char**)
{
    if (val11 == val22) // implicit conversion from an enum to int is available
        cout << "UE::val11 is equal to UE::val22" << endl;

    if (static_cast<int>(SE1::val1) == static_cast<int>(SE2::val1)) // have to apply explicit conversion
        cout << "SE1::val1 is equal to SE2::val1" << endl;

    if (SE1::val1 == SE2::val1) // error!!! Cannot make implicit conversions from a scoped enumeration.
        cout << "SE1::val1 is equal to SE2::val1" << endl;

    return 0;
}
Alan Milton
  • 374
  • 4
  • 13