C++ 未调用移动分配运算符

C++ 未调用移动分配运算符,c++,c++11,move,C++,C++11,Move,我刚刚做了一些关于移动语义的练习,我似乎不明白为什么我的移动赋值操作符没有被调用 我的课程如下(请忽略与问题无关的任何不良实践): 结果如下: Vector v1(3); Vector v2(3); Vector v3(3); Vector v4 = v1+v2; Adding Move constructor Destruct Destruct Destruct Destruct Destruct 我期望的是直线向量v4=v1+v2调用移动分配,但它不调用。相反,它调用move构造函数 我

我刚刚做了一些关于移动语义的练习,我似乎不明白为什么我的移动赋值操作符没有被调用

我的课程如下(请忽略与问题无关的任何不良实践):

结果如下:

Vector v1(3);
Vector v2(3);
Vector v3(3);
Vector v4 = v1+v2;
Adding
Move constructor
Destruct
Destruct
Destruct
Destruct
Destruct
我期望的是直线
向量v4=v1+v2
调用移动分配,但它不调用。相反,它调用move构造函数

我甚至尝试了
vectorv4=std::move(v2),但这也不起作用,并调用了移动构造函数


知道为什么没有调用移动分配吗?

从语义上讲,您没有调用移动分配

Vector v4 = v1+v2;
事实上:

Vector v4(v1+v2);
如果没有复制构造函数,但存在默认构造函数和可接受的赋值,则将调用赋值。如前所述,您需要执行以下操作:

Vector v4; v4 = v1 + v2;

要获得真正的赋值

从语义上讲,您并不是在调用赋值

Vector v4 = v1+v2;
事实上:

Vector v4(v1+v2);
如果没有复制构造函数,但存在默认构造函数和可接受的赋值,则将调用赋值。如前所述,您需要执行以下操作:

Vector v4; v4 = v1 + v2;

要获得真正的赋值

基本上是编译器的优化。赋值运算符仅在构造对象后调用。如果你做
向量v4;v4=v1+v2,应该调用赋值运算符。在继续使用C++11之前,您应该首先了解赋值是什么——您的代码没有任何赋值!相反,您有复制初始化。@leetNightshade:这不是优化。这是一个完全不同的构造。@Kerrek SB你知道这个构造叫什么吗?@leetNightshade:是的,它叫“复制初始化”。它基本上是编译器的优化。赋值运算符仅在构造对象后调用。如果你做
向量v4;v4=v1+v2,应该调用赋值运算符。在继续使用C++11之前,您应该首先了解赋值是什么——您的代码没有任何赋值!相反,您有复制初始化。@leetNightshade:这不是优化。这是一个完全不同的构造。@Kerrek SB你知道这个构造叫什么吗?@leetNightshade:是的,它叫“复制初始化”。
Vector v4 = v1+v2;