Garmaine Staff asked 1 year 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;

};

struct B : public virtual A {};

The following scenarios indeed cause the warning to occur

/*** SCENARIO 1 ***/
class C {

    B a;

    public:
        void foo(B& b) {

            b = a; // warning
            // or
            a = b; // warning

        }

};

/*** SCENARIO 2 ***/
void foo(const B& a, B& b) {

    b = a; // warning

}


int main() {

    /*** SCENARIO 3 ***/
    B b;
    std::vector<B> v1;
    v1.push_back(b); // warning

    /*** SCENARIO 4 ***/
    B b1;
    B b2;
    b1 = b2; // warning

    /*** SCENARIO 5 ***/
    B b3;
    b3 = B(); // warning

}

The warnings still occur even if the assigned from object is used again later. With the exception of Scenario 5 which involves an rvalue on the right side and therefore would involve a move assignment, I would expect (and indeed I want) a copy assignment to occur rather than a move assignment in these scenarios. If that is the case, then why is this warning occurring? Is a move assignment actually happening somewhere in the expressions?