C++ 为什么复制分配会导致GCC发出-Wvirtual move assign警告?

C++ 为什么复制分配会导致GCC发出-Wvirtual move assign警告?,c++,move-semantics,virtual-inheritance,C++,Move Semantics,Virtual Inheritance,如果为B的实例调用移动分配,则以下类层次结构将在GCC中导致[-Wvirtual move assign]警告 struct A { std::vector<int> v; }; struct B : public virtual A {}; 结构A{ std::向量v; }; 结构B:公共虚拟A{}; 以下情况确实会导致出现警告 /*** SCENARIO 1 ***/ class C { B a; public: void f

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

struct A {

    std::vector<int> v;

};

struct B : public virtual A {};
结构A{ std::向量v; }; 结构B:公共虚拟A{}; 以下情况确实会导致出现警告

/*** 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

}
/***场景1***/
C类{
B a;
公众:
富奥酒店(B&B){
b=a;//警告
//或
a=b;//警告
}
};
/***情景2***/
void foo(康斯特食宿酒店){
b=a;//警告
}
int main(){
/***情景3***/
B B;
std::向量v1;
v1.向后推(b);//警告
/***情景4***/
B b1;
B b2;
b1=b2;//警告
/***情景5***/
B b3;
b3=B();//警告
}

即使以后再次使用“指定自”对象,警告仍会出现。除了场景5(右侧有一个右值,因此会涉及移动分配)之外,我希望(事实上我希望)在这些场景中发生拷贝分配,而不是移动分配。如果是这样,那么为什么会出现这种警告?表达式中是否确实发生了移动指定?

看起来您遇到了误报。这个问题的答案表明,gcc发出这一警告的频率比实际需要的要高,而clang则没有。所以我加强了你的例子(正如在那个答案中所做的),并把它交给了clang

struct A {
    std::vector<int> v;
};

struct AA : public virtual A {};
struct AB : public virtual A {};

struct B : public AA, AB {};
结构A{ std::向量v; }; 结构AA:公共虚拟A{}; 结构AB:公共虚拟A{}; 结构B:公共AA,AB{};
通过此设置,clang仅对
b3=B()发出警告行(场景5)。它接受了其他情况,这表明gcc只是偏执狂。(gcc发布的是假阳性,或者clang有错误。不过,您的分析似乎是正确的,所以可能是前者。)

“我的问题就是这些”-请将您自己限制为每个问题一个特定的问题。谢谢。我很乐意这样做,但每个问题的设置都会重复。可以吗?嗯,可以。每个问题都应该是独立的,并且只问一件具体的事情。好的,我会这样做