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

Является ли "enum class" классом в С++?

Я читал об объявлении перечисления в С++, используя cppreference.

Затем я сделал класс Enum и проверял, является ли это типом класса или не использует std::is_class.

#include <iostream>

enum class Enum 
{
    red = 1, blue, green
};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<Enum>::value << '\n';
}

Затем я скомпилировал и запускал компилятор g++ на платформе Linux, он печатает false значение.

Так что Является enum типом класса или нет? Если enum - это тип класса, то почему я получаю значение false?

4b9b3361

Ответ 1

enum class не является определением class - комбинация ключевых слов используется для определения облачного перечисления, которое является полностью отдельным объектом из class.

std::is_class корректно возвращает false здесь. Если вы используете std::is_enum, он вернет true.


Из стандарта:

Тип перечисления, объявленный с помощью перечисляемого ключа только enum, представляет собой перечисление без пробелов, а его перечисления - неперечислимые счетчики. Переменные перечисления enum class и enum struct являются семантически эквивалентными; тип перечисления, объявленный одним из них, представляет собой скопированное перечисление, а его счетчики - это счетные счетчики.

Нет упоминания о enum class как о "class" в любом месте Стандарта.

Ответ 2

Несмотря на ключевое слово class, перечисления не являются классами. Это ключевое слово только означает, что счетчики должны соблюдать определенные правила определения области видимости (а также предотвращать неявные интегральные преобразования).

Выбор ключевого слова обусловлен аспектами, вызванными новым типом 1 и тем, как скопированные счетчики были взломаны вместе в эпоху pre-С++ 11, чтобы получить указанные аспекты:

struct Enum { // could just as well be a class.
  enum {
    red = 1, blue, green
  };
};

Это разрешало доступ к счетчикам только через квалифицированное имя. Хотя это не предотвращало неявных преобразований, например, нулевые перечисления с нумерацией.

is_class предназначен для определения типов агрегатов класса/структуры.


<суб > 1B. Stroustrup - С++ 11 FAQ Суб >