scoped enum 除了可以防止 namespace pollution 之外,還可以避免 enum 的成員被 implicitly convert to integer。

#include <iostream>
 
int main() {
    enum class Number {zero, one, two, three};
    if(Number::zero < 3) { // error: no match for 'operator<' (operand types are 'main()::Number' and 'int')
        std::cout << "smaller!\n"; 
    } else {
        std::cout << "bigger!\n";
    }
}

對照 unscoped 的 enum:

#include <iostream>
 
int main() {
    enum Number {zero, one, two, three};
    if(zero < 3) {
        std::cout << "smaller!\n";
    } else {
        std::cout << "bigger!\n";
    }
}
// output: smaller!

希望獲得列舉值的值時,將必須顯式的進行類型轉換,或是使用以下 template 去 overload << operator。

#include <iostream>
 
// template<typename T>
// std::ostream& operator<<(
//     typename std::enable_if<std::is_enum<T>::value,
//         std::ostream>::type& stream, const T& e)
// {
//     return stream << static_cast<typename std::underlying_type<T>::type>(e);
// }
 
enum class new_enum : unsigned int {
    value1,
    value2,
    value3 = 100,
    value4 = 100
};
 
int main() {
	 std::cout << new_enum::value3 << std::endl; // error: no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'new_enum')
 
    std::cout << (int)new_enum::value3 << std::endl; // valid!
    
 
}