右值引用
c++11中引入了右值引用,用&&表示,其中右值引用只能绑定到右值上 ,但可以使用std::move(),或static_cast<T&&>()显式的将左值转换为右值
int &&a=10; //Ok,绑定到右值上 ------------------------------------------ int a=10; int &&b=a; //error,右值引用不能绑定到左值 ----------------------------------------------------- int a=10; int &&b=std::move(a); //ok int &&c=static_cast<int&&>(a); //ok
int &&a=10; //Ok,绑定到右值上 -------------------------------------------------------- int fun(){return 10;} int &&a=fun(); //ok,函数返回值是临时对象,右值 ---------------------------------------------------------- int a=10; int &&b=a; //error,右值引用不能绑定到左值 ----------------------------------------------------- int a=10; int &&b=std::move(a); //ok int &&c=static_cast<int&&>(a); //ok
左值引用分两种情况:
1)
int a=10; int &b=a; //ok,绑定到左值上 int &c=10; //error,不能绑定到右值上
2)
int a=10; const int b=10; const int &c=a; //ok,绑定到int型左值 const int &d=b; //ok,绑定到const int型左值 const int &e=10; //ok,绑定到右值
引入右值引用的目的:右值通常是一个临时变量,可以对其做任意修改,右值引用可以避免右值使用时涉及到的临时对象构造,拷贝,析构等,减少内存开支,尤其是大型的动态结构作为右值时。因为我们都知道引用是对源对象的操作,而不是产生一个源对象的副本。所以可以通过函数重载,产生一个参数是右值引用的函数,这样当参数是右值时就会调用右值引用版本的函数,避免了左值传参方式产生副本增加的开销。
例如:
void fun(int a){cout<<1<<endl;} void fun(int &&a){cout<<2<<endl;} int main() { int a=10; fun(a); //输出1,参数为左值 fun(10); //输出2,参数为右值 return 0; }
注:虽然右值引用可以作为函数参数,但其在函数内部,被视为左值,所以当你希望在函数内部将其作为右值使用时,需要用上面提到的方法进行转换