Подтвердить что ты не робот

Enum, наследующий от примитивного типа

Из таких вопросов, как this и this, у меня сложилось впечатление, что наследование от примитивного типа приведет к ошибке компилятора. Однако следующий код компилирует и производит ожидаемый результат на Ideone.

#include <iostream>

enum class Test : unsigned short int
{
    TEST, TEST2, TEST3, TEST4
};

int main() {
    // your code goes here
    Test ans = Test::TEST3;

    if(ans == Test::TEST3)
    {
        std::cout << "Here" << std::endl;
    }

    return 0;
}

Является ли тот факт, что class также является enum, изменяет ответы в первых двух Q & A? Является ли это четко определенное поведение стандартом?

4b9b3361

Ответ 1

Это не означает наследование, это выбирает тип перечисления, лежащий в основе. Основной тип - это интегральный тип, который используется для представления значений счетчика.

Вы можете увидеть разницу в этом примере:

#include <iostream>

enum class tiny : bool {
    one, two   
};

enum class bigger : long {
    some, lots   
};

int main(int argc, char *argv[])
{
    std::cout << sizeof(tiny::one) << '\n';    //prints 1
    std::cout << sizeof(bigger::some) << '\n'; //prints 8
}

В С++ 11 вы можете указать базовый тип как скопированных (т.е. class), так и неперечисленных перечислений.

Ответ 2

enum class был добавлен в С++ 11, чтобы вы могли указать базовый тип для перечисления. Он повторяет синтаксис для наследования как аналог, но это не наследование.

Ответ 3

Это не наследование, это способ указать базовый тип.