https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80683
--- Comment #5 from Xi Ruoyao <ryxi at stu dot xidian.edu.cn> --- The issue is in cp/method.c: /* If that user-written default constructor would satisfy the requirements of a constexpr constructor (7.1.5), the implicitly-defined default constructor is constexpr. The implicitly-defined copy/move assignment operator is constexpr if - X is a literal type, and - the assignment operator selected to copy/move each direct base class subobject is a constexpr function, and - for each non-static data member of X that is of class type (or array thereof), the assignment operator selected to copy/move that member is a constexpr function. */ if (constexpr_p) *constexpr_p = ctor_p || (assign_p && cxx_dialect >= cxx14); But if we have default member initializers, the implicitly-defined default constructor can not be constexpr. We have to check it.