enum class keeps enum names inside the enum type.

Scoped Enums

scoped_enums.cpp
#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 = ;

    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 = ;

    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 = ;

    bool canEdit = role == Role::Admin;

    std::cout << "role=" << label(role) << std::endl;
    std::cout << "canEdit=" << canEdit << std::endl;
    return 0;
}
scoped enum A scoped enum uses names such as `Role::Admin`, which helps avoid accidental name conflicts.