Garmaine Staff asked 2 years ago

The following class hierarchy will cause a [-Wvirtual-move-assign] warning in GCC if a move assign is invoked for an instance of B.

struct A {

    std::vector<int> v; // I believe this can be a variable of any class
                        // that implements a move assignment.


struct B : public virtual A {};

Despite the warning, in this particular class hierarchy there appears at first to be no danger because A is not accessible through multiple paths, but someone could inherit from B and some other class C that inherits virtually from A and the problem arises. So lets assume we want to fix the issue correctly in case that happens.

According to this question, the correct way to solve this issue is to implement a move assignment operator for B that can detect that the virtual base class A is in the moved-from state and omit a second movement, however it does not provide an example of how this would be done correctly. Please provide an example of the implementation of move assignment for class B that correctly handles the duplicate move.

Should the move constructor also be implemented to avoid duplicate moves or does the default move constructor not suffer from the same problem? Please also provide an example if applicable.