在某个微信交流群里,有人求助如下问题:
其实乙的回答是中肯的。并不是带等号的一定是赋值操作。假如:
A a, b;
a = move(b);
那么确实是移动赋值操作,因为A已经被构造过了。
但是在本例中,a的声明和等号一起出现,此时算是移动构造,不算赋值。
看下面的实际例子:
#include <iostream>
#include <utility>
class A{
public:
A(){
a=0;
std::cout<<"default constructor"<<std::endl;
}
virtual ~A(){
std::cout<<"destructor"<<std::endl;
}
A(A && o) noexcept : a(std::exchange(o.a,0))
{
std::cout<<"move constructor"<<std::endl;
}
A &operator = (A && x){
a = x.a;
std::cout<<"move assignment"<<std::endl;
return *this;//have to return this
}
int a;
};
int main(void){
A a;
A b = std::move(a);
return 0;
}
显示结果:
打印了"move constructor",可见是移动构造。
现在把代码变为
A a b;
a = std::move(b);
效果: