std::move 和 std::forward
Note: std::move 不进行任何移动,std::forward 也不进行任何转发,它们仅仅执行强制型别转换的函数。std::move无条件地将实参强制转换成右值,而std::forward则尽在某个特定条件满足时才执行同一个强制转换。在运行期,二者不会做任何操作。
所有函数形参皆为左值。
区分万能引用和右值引用
1、如果函数模板形参具备T&&型别,并且T的型别系推导而来,或如果对象使用auto&&声明其型别,则该形参或对象就是个万能引用。
2、如果型别声明并不精确地具备type&&的形式,或者型别推导并未发生,则type&&就代表右值引用。
3、若采用右值来初始化万能引用,就会得到右值引用。若采用左值来初始化万能引用,就会得到一个左值引用。
RVO(返回值优化)
返回值优化需满足以下条件:
1、局部对象型别和函数返回值型别相同;
2、返回的是局部对象本身;
若编译器不选择进行复制省略,返回对象必须作为右值处理。
引用折叠
1、如果任一引用为左值引用,则结果为左值引用。否则(即两个皆为右值引用),结果为右值引用。
2、万能引用推导左值T的结果为左值引用类型T&,推导右值T结果为类型T。
3、引用折叠发生的语境有四种:
(1)模板实例化
(2)auto型别生成
(3)创建和运用typedef和别名声明
(4)decltype