/ / Dlaczego inicjowanie zmiennej wyliczania poza zakresem nie daje mi ostrzeżenia ani błędu? - c ++, wyliczenie

Dlaczego inicjalizacja zmiennej wyliczeniowej poza zasięgiem nie daje mi ostrzeżenia lub błędu? - c ++, wyliczenie

Rozważ kod:

enum spect{violet,indigo,blue,green=8};
spect band = spect (94);

Zgodnie z zasadą limitów w wyliczaniu, górny limit wynosiłby 2 ^ 4-1 = 15, a dolny wynosiłby 0 (zob. Książka C ++ Primer Plus).

Ale94>15 więc powinien dać ostrzeżenie lub błąd. Ale mój program działa dobrze. Czemu?

Odpowiedzi:

0 dla odpowiedzi № 1

Myślę, że ta książka jest albo błędna, albo źle zinterpretowałaś, co mówi o podstawowym typie wyliczenia. Specyfikacja C ++ 11 mówi:

§ 7.2

6 Dla wyliczenia, którego typem bazowym nie jestnaprawiono, podstawowy typ jest typem integralnym, który może reprezentują wszystkie wartości modułu wyliczającego zdefiniowane w wyliczeniu. Jeśli żaden typ całkowy nie może reprezentować wszystkich wartości modułu wyliczającego, wyliczenie jest źle sformułowane. Zdefiniowane jest wdrożenie, który typ całki ma być używany jako typ bazowy, z wyjątkiem tego, że typ bazowy nie może być większy niż int chyba że wartość moduł wyliczający nie może zmieścić się w int lub unsigned int. Jeśli lista wyliczająca jest pusty, typem podstawowym jest tak jakby wyliczenie miało jeden moduł wyliczający o wartości 0.

Ponadto:

§ 5.2.9

10 Może być wartością typu całka lub wyliczeniejawnie przekonwertowany na typ wyliczenia. Wartość wynosi niezmieniony, jeśli pierwotna wartość mieści się w zakresie wartości wyliczenia (7.2). W przeciwnym razie wynikowy wartość jest nieokreślona (i może nie znajdować się w tym zakresie). Wartość typu zmiennoprzecinkowego można również konwertować do typu wyliczenia. Wynikowa wartość jest taka sama jak konwersja pierwotnej wartości na instrument bazowy typ wyliczenia (4.9), a następnie typ wyliczenia.

Myślę, że książka może próbować wyjaśnić następującą klauzulę:

§ 7.2

7 W przypadku wyliczenia, którego typ podstawowy jest stały, wartości wyliczenia są wartościami typ podstawowy. W przeciwnym razie dla wyliczenia gdzie mimin jest najmniejszym wyliczającym i mimaks jest największa, wartości wyliczenia są wartościami z zakresu bmin do bmaks, zdefiniowane w następujący sposób: Let K być 1 dla reprezentacji dopełniacza dwóch i 0 dla reprezentacji dopełniacza lub wielkości znaku. bmaks jest najmniejszą wartością większą lub równą maks(|mimin| - K, |mimaks</ em>|) i równa 2M - 1, gdzie M jest nieujemną liczbą całkowitą. bmin wynosi zero, jeśli mimin jest nieujemny i - (bmax + K) Inaczej. Rozmiar najmniejsze pole bitowe wystarczająco duże, aby pomieścić wszystkie wartości typu wyliczenia to maks(M, 1) jeśli bmin</ sub> jest zero i M + 1 w przeciwnym razie. Możliwe jest zdefiniowanie wyliczenia, którego wartości nie są zdefiniowane przez żadną z nich wyliczacze. Jeśli… lista wyliczająca jest pusta, wartości wyliczenia są tak, jakby wyliczenie miało wartość pojedynczy moduł wyliczający o wartości 0.