我刚刚听完了关于C++11的软件工程广播采访Scott Meyers。其中大部分新特性对我来说都很有意义,只有一个例外。我还是不太明白移动语义...它到底是什么?
以下是来自Bjarne Stroustrup的书《C++编程语言》中的一个答案。如果您不想观看视频,可以查看下面的文字:
考虑这个片段。从operator+返回涉及将结果从局部变量res
复制到某个调用者可以访问它的地方。
Vector operator+(const Vector& a, const Vector& b)
{
if (a.size()!=b.size())
throw Vector_siz e_mismatch{};
Vector res(a.size());
for (int i=0; i!=a.size(); ++i)
res[i]=a[i]+b[i];
return res;
}
我们其实并不想要一个副本;我们只是想从函数中获得结果。所以我们需要移动一个向量而不是复制它。我们可以定义移动构造函数如下:
class Vector {
// ...
Vector(const Vector& a); // copy constructor
Vector& operator=(const Vector& a); // copy assignment
Vector(Vector&& a); // move constructor
Vector& operator=(Vector&& a); // move assignment
};
Vector::Vector(Vector&& a)
:elem{a.elem}, // "grab the elements" from a
sz{a.sz}
{
a.elem = nullptr; // now a has no elements
a.sz = 0;
}
&& 表示“右值引用”,是一个引用,我们可以将其绑定到右值上。 "rvalue" 的意思是补充 "lvalue",它大致意味着 "可以出现在赋值的左侧的东西"。因此,rvalue 大致意味着 "无法分配的值",例如函数调用返回的整数和 Vector 中 operator+() 的 res
局部变量。
现在,语句 return res;
将不会复制!