for - strongly typed enum c++ 11




Является ли «enum class» классом в C++? (2)

Я читал об объявлении перечисления в C ++, используя 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 - тип класса, то почему я получаю ложное значение?


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

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

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

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

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

1 B. Stroustrup - C ++ 11 Часто задаваемые вопросы


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

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

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

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

Нет упоминания о том, что enum class является « class » в любом месте Стандарта.





is-class