https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96645
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- And libc++'s std::variant is still affected by the same issue, but instead of the default constructor being deleted it just has the wrong exception specification: #include <variant> void testVarStruct() { struct DataWithStruct { struct A { int number = 5; // compiles, if remove initialization }; using Member = std::variant<A>; Member data; static_assert(std::is_nothrow_default_constructible_v<Member>); }; } The difference is that GCC defines the std::variant default constructor as defaulted, but libc++ defines it as: constexpr variant() noexcept(is_nothrow_default_constructible_v<variant_alternative<0, Types...>) That means the constructor isn't deleted for libc++, it just has the wrong noexcept-specifier. It looks like the nested class DataWithStruct::A isn't considered complete until after DataWithStruct is complete, but I'm not sure why that is.