右值引用与完美转发注意点

  • 右值引用本身是左值,右值引用延长了右值生命期,所以是左值
  • 字符串的字面值不是右值
  • 表达式产生的临时对象是右值
  • 左值通常拥有一段时间的存储期
  • 右值通常不会活过一条语句
  • static_cast变成的右值引用是右值,特殊规定
  • 返回值为右值引用的调用被视为右值
  • 只要写了拷贝构造,赋值或者析构函数的其中一个,移动构造和赋值不会

自动生成,定义了移动构造或者赋值,那么编译器并不会自动生成拷贝的任何

一个,但是不影响析构函数。

  • 移动过程天然对于异常敏感,所以使用std::move_if_noexcept()比std::move更好

 

 

  • 后面的那个fun()在c++17以前会报错,因为widget{}找不到右值构造,而c++17以后,直接

 

变成了w = widget{},叫做强制移动删除,会把返回值直接交给w,不会产生移动或拷贝。

 

 

 

 

 

  •  因为std::forward的特殊性质与引用折叠的定义,保证了传入参数的性质与CV保留
posted @ 2022-08-19 19:32  heisse  阅读(40)  评论(0)    收藏  举报