https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102199
--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> --- Because a user-provided inner() means it's default constructible, period. If that default constructor happens to be ill-formed, that's your problem and is outside the immediate context that is checked by is_default_constructible. Without that user-provided constructor, the compiler has to try to implicitly define a default constructor, which has to consider all the members and their default member initializers, which requires the type to be complete.