右值引用与完美转发注意点
- 右值引用本身是左值,右值引用延长了右值生命期,所以是左值
- 字符串的字面值不是右值
- 表达式产生的临时对象是右值
- 左值通常拥有一段时间的存储期
- 右值通常不会活过一条语句
- static_cast变成的右值引用是右值,特殊规定
- 返回值为右值引用的调用被视为右值
- 只要写了拷贝构造,赋值或者析构函数的其中一个,移动构造和赋值不会
自动生成,定义了移动构造或者赋值,那么编译器并不会自动生成拷贝的任何
一个,但是不影响析构函数。
- 移动过程天然对于异常敏感,所以使用std::move_if_noexcept()比std::move更好
- 后面的那个fun()在c++17以前会报错,因为widget{}找不到右值构造,而c++17以后,直接
变成了w = widget{},叫做强制移动删除,会把返回值直接交给w,不会产生移动或拷贝。
- 因为std::forward的特殊性质与引用折叠的定义,保证了传入参数的性质与CV保留