2011-06-27 9 views
12

Poszukałem tego pytania, myśląc, że ktoś wcześniej musiał go o to poprosić. Nie znalazłem żadnych wyników, więc jeśli tak było, opublikuj link i nie krępuj się, aby zamknąć pytanie.Co robi ten dwukropek w deklaracji enum?

natknąłem tego kodu w EASTL:

enum : size_type { // size_type = size_t     
       npos  = (size_type)-1, 
       kMaxSize = (size_type)-2 
      }; 

nigdy nie napotkał deklarację takiego enum. Co robi w tym przypadku :?

Odpowiedz

8

Jest to rozszerzenie Microsoft, który pozwala wybrać typ bazowy wartości enum. Na przykład, pozwala to określić, że wartości są niepodpisane (kompilatory Microsoftu zwykle wybierają domyślnie podpis) lub że zajmują tylko 8 lub 16 bitów (standardowo Microsoft ma domyślnie 32 bity).

Składnia jest udokumentowana tutaj: http://msdn.microsoft.com/en-us/library/2dzy4k6e(v=VS.100).aspx, ale nie jestem w stanie znaleźć oficjalnej dokumentacji tego, co faktycznie robi.

C++ 11 dodaje podobną funkcję, ale z nieco inną składnią. W C++ 11 napisałbyś to tak:

enum class MyEnum : size_type { .. values .. }; 
13

W C++ 0x można określić podstawowy typ wyliczenia. W takim przypadku będzie to size_type.

(I to może być obsługiwane jako rozszerzenie w innych miejscach przed C++ 0x, oczywiście).

+1

Wierzę, że C++ 0x wymaga "klasy enum" podczas określania typu bazowego. Bez "klasy" musi to być rozszerzenie dostawcy kompilatora. –

+1

@Jesse: Ach, dobrze. +1 do twojej odpowiedzi. – GManNickG

+1

@Jesse: Właściwie kod bez 'class' działa dobrze w C++ 11 i późniejszych. Użycie 'enum class' lub' enum struct' zamiast zwykłego 'enum' powoduje, że wyliczenie * ma zasięg *, a nie * nieosiada *, tzn. Zapobiega niejawnym konwersjom całkowitym. Zapewnienie odpowiedniego rodzaju jest możliwe w obu przypadkach. – Frank