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? Является ли это четко определенное поведение стандартом?
Ответы
Ответ 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
Это не наследование, это способ указать базовый тип.