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?
Please login or Register to submit your answer