Is "enum class" a class type in C++?

I read about enumeration declaration in C++ using cppreference.

Then I have made Enum class and check whether it is a class type or not using 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';

Then I compiled and ran in G++ compiler on Linux platform, it prints false value.

So Is enum class type or not? If enum is a class type, then why I'm getting false value?


enum class is not a class definition - the combination of keywords is used to define a scoped enumeration, which is a completely separate entity from a class.

std::is_class correctly returns false here. If you use std::is_enum, it will return true.

From the Standard:

The enumeration type declared with an enum-key of only enum is an unscoped enumeration, and its enumerators are unscoped enumerators. The enum-keys enum class and enum struct are semantically equivalent; an enumeration type declared with one of these is a scoped enumeration, and its enumerators are scoped enumerators.

There is no mention of an enum class being a "class type" anywhere in the Standard.

Despite the class keyword, enumerations are not classes. That keyword only means the enumerators must respect certain scoping rules (and also prevents implicit integral conversions).

The choice of the keyword is due to the aspects brought about by the new type1, and how scoped enumerators were hacked together in the pre-C++11 era, to obtain said aspects:

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

Which only allowed the enumerators to be accessed via the qualified name. Though it didn't prevent implicit conversions like true scoped enumerations do.

is_class is meant to identify the class/struct aggregate types.

1 B. Stroustrup - C++11 FAQ

Need Your Help

Conditional operator differences between C and C++

c++ c conditional-operator

I read somewhere that the ?: operator in C is slightly different in C++, that there's some source code that works differently in both languages. Unfortunately, I can't find the text anywhere. Does ...