2014-08-27 7 views
8

Ich versuche den Standardwert zu ermitteln, auf den globale Enums mit starkem Typ initialisiert werden. Der folgende Code kompiliert natürlich nicht.Was sind globale stark typisierte Enums, die standardmäßig in C++ initialisiert werden?

#include <iostream> 
using namespace std; 

enum class A{a=10, b=20}; 

// Global strongly-typed enum, uninitialized 
A k; 

int main() { 
    if(k==A::a) 
     cout<<"Equal to a"<<endl; 
    else if(k==A::b) 
     cout<<"Equal to b"<<endl; 
    else if(k==0) 
     cout<<"Equal to zero"<<endl; 

    return 0; 
} 

Was ist 'k' initialisiert?

+2

@JohnnyMopp Nein, das ist kein Duplikat. Die Verknüpfung, die Sie verknüpft haben, fragt nach einer Funktionskopie ohne Aufzählung. In diesem Fall handelt es sich um eine Namespace-Scope-Bereichsaufzählung. * Sehr * verschiedene Dinge. – Angew

+0

ist es ein Duplikat. Sie können die Antwort für Ihre Frage in der Antwort für das Duplikat finden, das oben verbunden ist – glezmen

+2

@gglezmen Ich denke immer noch nicht - dass andere Frage nicht die aufgezählten Aufzählungen bedeckt. Ja, die Antwort ist die gleiche, aber das ist keine doppelte Frage. – Angew

Antwort

2

Es ist Null initialisiert. Berücksichtigen Sie dabei, dass der darunter liegende Typ dieser Aufzählung ist int (Standard) und 0 ist eine gültige enumerator wenn es nicht explizit in jeder Aufzählungs Definition der Aufzählung verwendet wird ..

Nur Sie

else if(k == static_cast<A>(0)) 
    cout<<"Equal to zero"<<endl; 
schreiben

Wenn Sie C# verwenden würden, dann kann null implizit zu einer Aufzählung von jeder Art umgewandelt werden. :)

9

k hat statische Speicherdauer und statische Objekte sind Null initialisiert, können wir dies sehen durch 3.6.2 zum draft C++ standard Abschnitt gehen Initialisierung nicht lokalen Variablen Absatz :

Variables mit statischen Speicherdauer (3.7.1) oder Fadenspeicher Dauer (3.7.2) beträgt Null initialisiert (8,5) vor jedem anderen Initialisierung findet statt. [...]

für skalare Typen, die bedeutet Initialisierung auf Null, der Abschnitt bedeckt ist 8.5 Absatz die sagt:

auf Null initialisieren, ein Objekt oder Referenz vom Typ T Mittel :

und umfasst die folgenden Aufzählungs:

wenn T einen skalaren Typ (3,9) ist, wird das Objekt auf den Wert initialisiert erhalten, indem die Ganzzahlliteral 0 (Null) bis T umwandelt; 105

wissen wir eine ENUM eine skalare Typ aus dem Abschnitt ist 3.9Typen Absatz die sagt:

Arithmetik-Typen (3.9.1), Aufzählungstypen, Zeigertypen, Zeiger auf Elementtypen (3.9.2), std :: nullptr_- t, und cv -qualifizierte Versionen von diese Typen (3.9.3) sind zusammen skalare Typen genannt. [...]

zero ist ein gültiger Wert, da der zugrunde liegende Typ sein Wert und Abschnitt 7.2Enumeration Erklärungen Absatz sagt enthalten kann, dass eine Aufzählung einen Wert annehmen kann nicht definiert durch seine Enumeratoren:

[...]] Es ist möglich, eine Enumeration zu definieren, deren Werte nicht von einem ihrer Enumeratoren definiert sind. [...]

Verwandte Themen