- 将=default用于拷贝控制成员
- 使用=default阻止拷贝类对象
如果我们不希望合成的成员是内联函数应该只对成员的类外定义使用=default,就像对拷贝赋值运算符所作的。
通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了它们,但不能以任何方式使用它们。在函数的参数列表后面加上=delete来指出我们希望将它定义为删除的。
析构函数不能是删除的成员。 - 用移动类对象代替拷贝类对象
移动构造函数通常是将资源从给定对象“移动”而不是拷贝到正在创建的对象。
std::move定义在utility头文件中。当使用move时,直接调用std::move而不是move. - 右值引用
所谓右值引用就是必须绑定到右值的引用。通过&&而不是&来获得右值引用。右值引用有一个重要的性质——只能绑定到一个将要销毁的对象。因此我们可以自由地将一个右值引用的资源“移动”到另一个对象中。一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值。一个右值引用不过是某个对象的另一个名字。对于常规引用是左值引用,不能将其绑定到要求转换的表达式、字面常量或是返回右值的表达式。右值引用有着完全相反的绑定特性:可以将一个右值引用绑定到这类表达式上,但不能将一个右值引用直接绑定到一个左值上。
返回非引用类型的函数,连同算术、关系、位以及后置递增/递减运算符,都生成右值。我们不能将一个左值引用绑定到这类表达式上,但我们可以将一个const的左值引用或者一个右值引用绑定到这类表达式上。
左值持久;右值短暂,右值要么是字面