enum class keeps enum names inside the enum type.

scoped enum A scoped enum uses names such as `Role::Admin`, which helps avoid accidental name conflicts.

Scoped Enums

role
scoped_enums.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

enum class Role {
    Guest,
    Member,
    Admin
};

std::string label(Role role) {
    if (role == Role::Admin) {
        return "admin";
    }
    if (role == Role::Member) {
        return "member";
    }
    return "guest";
}

int main() {
    Role role = Role::Member;

    bool canEdit = role == Role::Admin;

    std::cout << "role=" << label(role) << std::endl;
    std::cout << "canEdit=" << canEdit << std::endl;
    return 0;
}
#include <iostream>
#include <string>

enum class Role {
    Guest,
    Member,
    Admin
};

std::string label(Role role) {
    if (role == Role::Admin) {
        return "admin";
    }
    if (role == Role::Member) {
        return "member";
    }
    return "guest";
}

int main() {
    Role role = Role::Guest;

    bool canEdit = role == Role::Admin;

    std::cout << "role=" << label(role) << std::endl;
    std::cout << "canEdit=" << canEdit << std::endl;
    return 0;
}
#include <iostream>
#include <string>

enum class Role {
    Guest,
    Member,
    Admin
};

std::string label(Role role) {
    if (role == Role::Admin) {
        return "admin";
    }
    if (role == Role::Member) {
        return "member";
    }
    return "guest";
}

int main() {
    Role role = Role::Admin;

    bool canEdit = role == Role::Admin;

    std::cout << "role=" << label(role) << std::endl;
    std::cout << "canEdit=" << canEdit << std::endl;
    return 0;
}
  1. role ← 1, canEdit ← 0

    20int main() {21    Role role→ 1 = Role::Member; //@role=Role::Guest, Role::Admin2223    bool canEdit→ 0 = role1 == Role::Admin;2425    std::cout << "role=" << label(role1) << std::endl;26    std::cout << "canEdit=" << canEdit << std::endl;
  2. std::string label(Role role)

    10std::string label(Role role1) {11    if (role == Role::Admin) {
  3. if (role == Role::Member)

    13}14if (role1 == Role::Member) {15    return "member";16}
  4. std::cout << "role=" << label(role) << std::endl;

    25    std::cout << "role=" << label(role1) << std::endl;26    std::cout << "canEdit=" << canEdit0 << std::endl;27    return 0;28}
    outputrole=member
    canEdit=0
  1. role ← 0, canEdit ← 0

    20int main() {21    Role role→ 0 = Role::Guest;2223    bool canEdit→ 0 = role0 == Role::Admin;2425    std::cout << "role=" << label(role0) << std::endl;26    std::cout << "canEdit=" << canEdit << std::endl;
  2. std::string label(Role role)

    10std::string label(Role role0) {11    if (role == Role::Admin) {12        return "admin";13    }14    if (role == Role::Member) {15        return "member";16    }17    return "guest";18}
  3. std::cout << "role=" << label(role) << std::endl;

    25    std::cout << "role=" << label(role0) << std::endl;26    std::cout << "canEdit=" << canEdit0 << std::endl;27    return 0;28}
    outputrole=guest
    canEdit=0
  1. role ← 2, canEdit ← 1

    20int main() {21    Role role→ 2 = Role::Admin;2223    bool canEdit→ 1 = role2 == Role::Admin;2425    std::cout << "role=" << label(role2) << std::endl;26    std::cout << "canEdit=" << canEdit << std::endl;
  2. std::string label(Role role)

    10std::string label(Role role2) {11    if (role == Role::Admin) {
  3. if (role == Role::Admin)

    10std::string label(Role role) {11    if (role2 == Role::Admin) {12        return "admin";13    }
  4. std::cout << "role=" << label(role) << std::endl;

    25    std::cout << "role=" << label(role2) << std::endl;26    std::cout << "canEdit=" << canEdit1 << std::endl;27    return 0;28}
    outputrole=admin
    canEdit=1