重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“c++11 左值引用和右值引用的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++11 左值引用和右值引用的用法”吧!
为合阳等地区用户提供了全套网页设计制作服务,及合阳网站建设行业解决方案。主营业务为成都网站制作、做网站、外贸营销网站建设、合阳网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
左值是表达式结束后依然存在的持久对象,既能出现在等号左边也能出现在等号右边的变量或表达式
右值是因为声明结束后会被销毁,所以不能放在等号左边
#includeusing namespace std; void Print(string& s){ cout << s; } int main(){ string s="abc"; Print(s); // OK Print("abc"); // parse error }
&是c++里的左值引用
&&是c11里的右值引用
右值只能被const引用指向,在这时,右值的生命周期被延长了,直到引用销毁。
因为右值只能被const引用指向,所以我们才会在拷贝构造函数和赋值函数形参内加上const(还有一个原因是避免参数被修改),这里c11出现了一个特殊智能指针的non const拷贝构造函数
string Proc() { return string("abc"); } int main() { const string& ref = Proc(); //此时右值的生命周期延长了,直到main函数结束 cout << ref << endl; return 0; }
使用std::move()接受一个参数,返回该参数对应的右值引用
templateinline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) { return static_cast ::type&&>(__t); } static_cast是一个强制类型转换符,强制类型转换会告诉编译器:我们知道并且不会在意潜在的精度损失。
//下面有一个move使用的小例子 void swap(T& a, T& b) { T tmp = move(a); a = move(b); b = move(tmp); //可以看出相比较之前的进行了多次资源拷贝、销毁的swap //在swap里使用move只是进行了三次的指针交换,效率提升 }
forward()接收一个参数,返回该参数本来所对应的类型的引用。(即完美转发)
#include//#include //for std::forward using namespace std; void print(const int& t) { cout <<"lvalue" << endl; } void print(int&& t) { cout <<"rvalue" << endl; } template void Test(T&& v) //v是Universal引用 { //不完美转发 print(v); //v具有变量,本身是左值,调用print(int& t) //完美转发 print(std::forward (v)); //按v被初始化时的类型转发(左值或右值) //强制将v转为右值 print(std::move(v)); //将v强制转为右值,调用print(int&& t) } int main() { cout <<"========Test(1)========" << endl; Test(1); //传入右值 int x = 1; cout <<"========Test(x)========" << endl; Test(x); //传入左值 cout <<"=====Test(std::forward (1)===" << endl; Test(std::forward (1)); //T为int,以右值方式转发1 //Test(std::forward (1)); //T为int&,需转入左值 cout <<"=====Test(std::forward (x))===" << endl; Test(std::forward (x)); //T为int,以右值方式转发x cout <<"=====Test(std::forward (x))===" << endl; Test(std::forward (x)); //T为int,以左值方式转发x return 0; } /*输出结果 e:\Study\C++11\16>g++ -std=c++11 test2.cpp e:\Study\C++11\16>a.exe ========Test(1)======== lvalue rvalue rvalue ========Test(x)======== lvalue lvalue rvalue =====Test(std::forward (1)=== lvalue rvalue rvalue =====Test(std::forward (x))=== lvalue rvalue rvalue =====Test(std::forward (x))=== lvalue lvalue rvalue */
感谢各位的阅读,以上就是“c++11 左值引用和右值引用的用法”的内容了,经过本文的学习后,相信大家对c++11 左值引用和右值引用的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!