https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89700
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- You're mistaken. struct X { std::string str = "not empty"; X() = default; X(const X&) = default; }; This type does not have a move constructor. Copying an rvalue will perform a copy (not a move): X x1; X x2 = std::move(x1); // calls copy constructor But it does not have a deleted move constructor. It has no move constructor. That's different. If it had a deleted move constructor then the initialization of x2 above would fail to compile.