Как обрабатываются константные выражения в перечислении С++?

Каков диапазон перечисления С++ с постоянным выражением? это мой код

#include <iostream>

int main(){
    enum e3{min = -10, max = 100000};
    e3 x = e3(-1000);
    e3 y= e3(-100000912241);
    std::cout<<x<<" "<<y<<std::endl;
}

Выводит -1000 -1216664433

Как это происходит? Кроме того, The C++ programming language by Bjarne Stroustrup указывает, что результат преобразования целочисленного типа в перечисление не определен, если только значение не находится в пределах диапазона перечисления. Что это за диапазон и как его рассчитать?


person Krash    schedule 17.11.2017    source источник
comment
Я рекомендую не использовать значения enums как целые числа. Это плохой дизайн, так как это не цель их использования. Возможно, struct будет хорошей заменой. Вот почему c++ предпочитает классы enum обычным перечислениям.   -  person Arash    schedule 17.11.2017


Ответы (1)


Диапазон enum — это диапазон базового типа. Компилятор, вероятно, выбрал int в качестве базового типа вашего enum.

Это разрешено, поскольку int (при условии, что на вашей платформе он 32-битный) может содержать все явные значения, которые вы ему дали.

Вероятно, вы обнаружите, что тип -100000912241 — это long или long long на вашей платформе (обратите внимание, что в C++ нет такой вещи, как отрицательный литерал: -100000912241 — это унарное отрицание литерала 100000912241.). Но -100000912241 не может вписаться в этот int, поэтому поведение вашего кода не определено.

Если вы хотите проверить базовый тип enum, используйте std::underlying_type.

Ссылка: http://en.cppreference.com/w/cpp/types/underlying_type< /а>

person Bathsheba    schedule 17.11.2017
comment
Это имеет смысл, но каков диапазон перечисления? Предполагается, что перечисление принимает все целочисленные значения или только значения в определенном диапазоне на основе его инициализации - person Krash; 17.11.2017
comment
@Krash: добавил это к ответу. - person Bathsheba; 17.11.2017