默认赋值
默认构造
移动构造
移动赋值
析构
右值、右值引用
右值引用:某些涉及复制大量值的操作可通过简单地复制指向这些值的指针来实现。
type && name —— 函数入参指定右值引用参数
左值转右值:std::move()
void helper(std::string&& message);
void handleMessage(std::string&& message) {
helper(message); // 错误
}
void handleMessage(std::string&& message) { // message 此时已经是左值
helper(std::move(message)); // 正确
}
声明右值引用类型的变量
int& a{2}; // 错
int&& a{2}; // 正确
如果将临时值赋值给右值引用,主要右值引用还在作用域内,临时值的生命周期就会延长。
x++; // 右值。编译器生成一个x的临时值,再递增。返回临时值。
++x; // 左值。对x递增后,返回x本身。
移动语义
移动构造(函数)、移动赋值(符)—— 使用noexcept限定符标记
编译器:
生成默认移动构造——没有声明:析构;拷贝(构造、赋值);移动赋值
生成默认移动赋值——没有声明:析构;拷贝(构造、复制);移动构造;
—— 5原则 rule of five。声明一个时,需要声明所有。(=default、=delete)
用交换方式实现移动(构造、赋值)—— swap 函数
template <typename T>
void swapMove(T& a, T& b) {
T t{std::move(a)};
a = std::move(b);
b = std::move(t);
}
ROV — 返回值优化。return obj -> 移动赋值。