右值 , 折叠引用详细说明:move 右值 折叠引用
右值(严格来说是右值变量)只能绑定到一个匿名的临时对象
1. 先简介 右值 与 模板参数的关系
右值简介:
int i = 10;
int& r = i; //ok
int&& rr = i ; //error . 右值只能绑定字面量或临时对象;
int&& rr2 = 55; //ok
int& lr = rr2; //ok , 左值可以绑定左值. rr2是一个左值(变量);
//这个很重要, 虽然rr是右值引用, 但本身还是一个左值变量
int&& rr3 = rr; //error , rr是一个左值, rr3无法绑定到一个左值;
//当然可以强制类型转换: std::move , move实现就是static_cast;
int&& rr3 = std::move(r); // static_cast<int&&>(r);
需要注意:
int &&rr3 = rr; //error
int &&rr3 = std::move(rr) //ok
这2行代码一定要理解, 否则std::forward 将永远是一个谜. 另一个帖子详细的讲述了右值:
https://blog.youkuaiyun.com/dashoumeixi/article/details/83063207
右值在模板中有例外:
//有如下普通函数:
void f_1(int&& i){}
只能如此调用: f_1(100); 但对于模板有例外
//折叠引