Why do we need to use virtual ~A() = default; instead of virtual ~A() {} in C++11?
In Stack Overflow post Checking the object type in C++11 , I have the comment: In C++11 you'll actually want to do virtual ~A() = default; Otherwise, you'll lose the implict move constructors. What is virtual ~A() = default; for? How come implicit move constructors lost with virtual ~A() {} ? The comment is not correct. Both: virtual ~A() = default; and virtual ~A() {} are user declared . And the implicit move members are inhibited if the destructor is user declared. [dcl.fct.def.default]/p4 discusses user-declared and user-provided special members: A special member function is user-provided