https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85831
Bug ID: 85831 Summary: <stdexcept> types should have move constructors and move assignment operators Product: gcc Version: 8.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- The standard says: namespace std { class logic_error : public exception { public: explicit logic_error(const string& what_arg); explicit logic_error(const char* what_arg); }; } The lack of user-declared special members means that a move constructor and move assignment operator should be implicitly declared. But we define: class logic_error : public exception { [...] virtual ~logic_error() _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT; [...] }; The user-declared destructor means there is no move constructor or move assignment operator. (The user-defined destructor is the key function and ensures the vtable and RTTI are only emitted in the library, not in every TU).