Код: Выделить всё
#include
enum class e16 : uint16_t { x16, y16 };
enum class e32 : uint32_t { x32, y32 };
int main() {
e32{ uint16_t{} }; // okay
e32{ uint32_t{} }; // okay
e16{ uint16_t{} }; // okay
e16{ uint32_t{} }; // not allowed -- narrowing
}
Код: Выделить всё
#include
enum class e16 : uint16_t { x16, y16 };
enum class e32 : uint32_t { x32, y32 };
int main() {
uint16_t{ e16{} }; // should be okay
uint16_t{ e32{} }; // narrowing
uint32_t{ e16{} }; // should be okay
uint32_t{ e32{} }; // should be okay
}
Чтобы избежать сужения преобразований, я создал функцию приведения шаблона, использующую SFINAE:
Код: Выделить всё
#include
#include
template
inline constexpr INT enum_int_cast(ENUM e) { return static_cast( e ); }
enum class enum8 : uint8_t {};
enum class enum16 : uint16_t {};
enum class enum32 : uint32_t {};
enum class enum64 : uint64_t {};
int main() {
enum_int_cast ( enum8 {} ); // okay
enum_int_cast ( enum16{} ); // not allowed -- narrowing
enum_int_cast ( enum32{} ); // not allowed -- narrowing
enum_int_cast ( enum64{} ); // not allowed -- narrowing
enum_int_cast( enum8 {} ); // okay
enum_int_cast( enum16{} ); // okay
enum_int_cast( enum32{} ); // not allowed -- narrowing
enum_int_cast( enum64{} ); // not allowed -- narrowing
enum_int_cast( enum8 {} ); // okay
enum_int_cast( enum16{} ); // okay
enum_int_cast( enum32{} ); // okay
enum_int_cast( enum64{} ); // not allowed -- narrowing
enum_int_cast( enum8 {} ); // okay
enum_int_cast( enum16{} ); // okay
enum_int_cast( enum32{} ); // okay
enum_int_cast( enum64{} ); // okay
}
Я знаю, что инициализация фигурных скобок не вызывает явных конструкторов, поэтому может показаться, что использование фигурных скобок означает, что неявное преобразование невозможно, но это, похоже, исключает область видимости_enum{ целое число тоже.
Подробнее здесь: https://stackoverflow.com/questions/791 ... owing-by-u