Two aspects of enums have been changed since the ARM. The most important
change is probably that you can now overload operators based on an
enumeration instead of it being treated as an integral type.

The other aspect is that although enumeration types are no longer integral types, they now explicitly support arithmetic within certain boundaries.

enum Status { OK, Busy, Stopped }; bool operator==(Status a,Status b);

This was previously ill-formed before because enumeration types were treated as
**int**.

The other aspect is that although enumeration types are no longer integral types, they now explicitly support arithmetic within certain boundaries.

Every enumeration type has an associated 'underlying type' which is
large enough to hold all the bits needed to represent the largest
and smallest values specified by the enumerators. The underlying
type may be larger than necessary but 'not gratuitously larger than
**int**'.

enum Status { OK, Busy, Stopped };

The smallest value is 0, the largest is 2. The underlying type needs
a least two bits so the underlying could be a **char** or it could
be larger. It's unlikely to be larger than an **int**.

enum Range { Low = -40000, High = 40000 };

Here the range needs 17 bits so the underlying type might be **int**
on a 32-bit machine or **long** on a 16-bit machine.