C++ 在类中正确实现移动语义,该类实际上从具有非平凡移动赋值运算符的类继承

C++ 在类中正确实现移动语义,该类实际上从具有非平凡移动赋值运算符的类继承,c++,move-semantics,virtual-inheritance,C++,Move Semantics,Virtual Inheritance,如果为B的实例调用移动分配,则以下类层次结构将在GCC中导致[-Wvirtual move assign]警告 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 {}; 结构A

如果为B的实例调用移动分配,则以下类层次结构将在GCC中导致[-Wvirtual move assign]警告

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 {};
结构A{ std::vector v;//我相信这可以是任何类的变量 //实现移动分配的。 }; 结构B:公共虚拟A{}; 尽管有警告,但在这个特定的类层次结构中,一开始似乎没有危险,因为A不能通过多个路径访问,但有人可能从B继承,而其他一些类C实际上从A继承,因此问题就出现了。因此,假设我们希望在发生这种情况时正确地解决问题

根据这一点,解决此问题的正确方法是为B实现移动分配操作符,该操作符可以检测虚拟基类a处于moved from状态,并省略第二个移动,但是它没有提供如何正确执行此操作的示例。请提供B类正确处理重复移动的移动分配实施示例


是否应该实现移动构造函数以避免重复移动,或者默认的移动构造函数不会遇到相同的问题?如果适用,请提供一个示例。

是否提供了见解?(可能不完全是重复的?)好吧,如果多线程不是一个问题,只需添加一个
bool i\u have\u have\u move\u from\u ready\u so\u走开类成员,并相应地实现它?@JaMiT它肯定回答了我关于move构造函数的问题,并提供了很多见解。我没有理解的一个部分是,类的move赋值操作符是否负责将整个层次结构的数据移动到它上面,还是更像是实现了一个构造函数,您通常负责当前类(假设初始值设定项列表中没有任何内容)而初始化基类则由它们各自的constructors@JaMiT我只见过不在类中的类的移动赋值运算符的示例hierarchy@AdamSperry:所有特殊成员函数都负责调用相应的基类函数,只有默认构造函数和析构函数这是一种有用的自动方式。如果没有叶类的合作,很难解决这个问题;编译器必须生成每个构造函数和析构函数的两个副本来处理这些情况。