https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105255
--- Comment #1 from Giovanni Cerretani <cerrigno at gmail dot com> --- I attach also a more comprehensive test that also checks conversions from integer to enumeration types (https://godbolt.org/z/jbe76E3c1). The behavior of direct-list-initialization has changed on C++17, and all tested compilers correctly implement it. #if __cplusplus < 201703L // unscoped static_assert( is_narrowing<my_enum_opaque_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_opaque_unsigned, signed_t>::value, ""); static_assert( is_narrowing<my_enum, signed_t>::value, ""); static_assert( is_narrowing<my_enum_auto_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_auto_unsigned, signed_t>::value, ""); static_assert( is_narrowing<my_enum_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_unsigned, signed_t>::value, ""); // scoped static_assert( is_narrowing<my_enum_opaque_scoped, signed_t>::value, ""); static_assert( is_narrowing<my_enum_opaque_scoped_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_opaque_scoped_unsigned, signed_t>::value, ""); static_assert( is_narrowing<my_enum_scoped, signed_t>::value, ""); static_assert( is_narrowing<my_enum_scoped_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_scoped_unsigned, signed_t>::value, ""); #else // unscoped static_assert(!is_narrowing<my_enum_opaque_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_opaque_unsigned, signed_t>::value, ""); static_assert( is_narrowing<my_enum, signed_t>::value, ""); static_assert( is_narrowing<my_enum_auto_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_auto_unsigned, signed_t>::value, ""); static_assert(!is_narrowing<my_enum_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_unsigned, signed_t>::value, ""); // scoped static_assert(!is_narrowing<my_enum_opaque_scoped, signed_t>::value, ""); static_assert(!is_narrowing<my_enum_opaque_scoped_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_opaque_scoped_unsigned, signed_t>::value, ""); static_assert(!is_narrowing<my_enum_scoped, signed_t>::value, ""); static_assert(!is_narrowing<my_enum_scoped_signed, signed_t>::value, ""); static_assert( is_narrowing<my_enum_scoped_unsigned, signed_t>::value, ""); #endif