Следующая иерархия классов вызовет предупреждение [-Wvirtual-move-assign] в G CC, если присвоение перемещения вызывается для экземпляра B.
struct A {
std::vector<int> v;
};
struct B : public virtual A {};
Следующий сценарий ios действительно вызывает предупреждение
/*** 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
}
Предупреждения по-прежнему появляются, даже если назначенный объект снова используется позже. За исключением Сценария 5, который включает в себя r-значение на правой стороне и, следовательно, будет включать в себя назначение перемещения, я ожидал (и действительно хочу), чтобы в этом сценарии происходило назначение копирования, а не перемещение, ios. Если это так, то почему возникает это предупреждение? Действительно ли где-то в выражениях происходит перемещение?