According to standard:
A copy/move constructor for class X is trivial if it is not user-provided and if
— class X has no virtual functions (10.3) and no virtual base classes (10.1), and
— the constructor selected to copy/move each direct base class subobject is trivial, and
— for each non-static data member of X that is of class type (or array thereof), the constructor selected to copy/move that member is trivial;
otherwise the copy/move constructor is non-trivial.
I think the standard introduced the concept "trival cp/mv ctor" to infer that you can just copy the classes using std::memcpy instead of calling constructor, and there'll be no undefined behavior.
However, the standard doesn't allow the existance of virtual functions, of which I think is against the spirit of "trival cp/mv ctor". A classes with a vtable pointing to virtual functions can still be copied with std::memcpy and has the right behavior. After all, you can't change the vtable of a class in runtime -- that will break other instances of this class.
So, why can't classes with no user-provide cp/mv ctor and have virtual functions but no virtual bases have "trival cp/mv ctor"?
memcpy
I mean. – StoryTeller - Unslander Monicastruct B { virtual ~B() {} }; struct D : B {}; D x; B y, *p; p = &x; memcpy(&y, p, sizeof y);
. – melpomene