2016-11-30 8 views
1

Betrachten Sie diesen Code:Warum erhalte ich keine Warnung für den Vergleich von Vergleichswerten?

typedef enum Type1 
{ 
    val11, 
    val12 
} Type1; 

typedef enum Type2 
{ 
    val21, 
    val22 
} Type2; 

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

Visual Studio 2015 herausgibt keine Warnung (auch mit/Wand). type1 und val22 sind jedoch nicht vom selben Typ. Ist das normal oder ist es ein Visual Studio Bug?

+0

wenn es so etwas wie C# Aufzählungen ist sind nur durch eine ganze Zahl gesichert, so dass, wenn in c gilt ++ es vielleicht gleichwertig sein könnte 'if (Typ1 == 1)' – Kritner

+0

Das ist normal. Beide Seiten des Gleichheitsoperators werden in "int" umgewandelt. – Leon

+3

Schreiben Sie modernen C++ - Code, verwenden Sie 'enum class'. –

Antwort

0

Soweit ich weiß, ist der Compiler nicht verpflichtet, beim Vergleich von Aufzählungen verschiedener Typen eine Warnung auszugeben. Ich konnte es im Standard nicht finden. Für klassische Enum-Typen existiert eine implizite Typkonvertierung in int, so dass der resultierende Code vollkommen legal ist. Semantisch ist es oft falsch, Aufzählungen verschiedener Typen zu vergleichen. Daher haben wir seit C++ eine Aufzählungskonstruktion, die keine impliziten Konvertierungen erlaubt. (Siehe den Code unten).

#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; 
} 
Verwandte Themen