Причина отсутствия неявного преобразования (по замыслу) была дана в других ответах.
Я лично использую унарный operator+
для преобразования классов enum в их базовый тип:
template <typename T>
constexpr auto operator+(T e) noexcept
-> std::enable_if_t<std::is_enum<T>::value, std::underlying_type_t<T>>
{
return static_cast<std::underlying_type_t<T>>(e);
}
Что дает довольно мало «накладных расходов»:
std::cout << foo(+b::B2) << std::endl;
Где я на самом деле использую макрос для создания перечислений и функций оператора в одном кадре.
#define UNSIGNED_ENUM_CLASS(name, ...) enum class name : unsigned { __VA_ARGS__ };\
inline constexpr unsigned operator+ (name const val) { return static_cast<unsigned>(val); }