Enumerated data types allow you to define a custom data type that can only take on a set list of values. The syntax uses the enum keyword followed by an identifier list inside curly braces. Enums can be scoped or unscoped. Scoped enums require the enum name to access enumerators while unscoped enums make enumerators visible without qualification. Enums are commonly used to work with flags by assigning powers of 2 to enum values, allowing multiple flags to be combined using bitwise operators. The string values of an enum can be printed by storing the enum names in an array and indexing it with the enum values.