摘要
1.左值与右值最理性的了解。自然,左值也是能够 在右侧的。左值是能够 被改动的,右值不可以。自然取详细地址也是。存活周期时间一般左值会比右值的长,一般右值都测算时造成的無名临时性目标,存有時间较为短。下边也有一种状况还要区别。2.左值引入和右值引用左值引入:能够 引入一个目标,有时还可以关联一个右值。右值引用:只有引入右值。1左值引入实例看下列编码,较为一切正常。 int a = 3; int &…
正文
1.左值与右值
最理性的了解。
自然,左值也是能够 在右侧的。
左值是能够 被改动的,右值不可以。
自然取详细地址也是。
存活周期时间一般左值会比右值的长,一般右值都测算时造成的無名临时性目标,存有時间较为短。
下边也有一种状况还要区别。
2.左值引入和右值引用
左值引入:能够 引入一个目标,有时还可以关联一个右值。
右值引用:只有引入右值。
1左值引入实例
看下列编码,较为一切正常。
int a = 3;
int &p1 = a; // 左值引入
若左值引入右值将出错
但再加上const就可以引入了
2右值引用实例
不可以把左值关联到右值,但应用move能够 把左值变换右值就可以关联
实例1
实例2
实例3
了解了上面专业知识,下面是引入伸缩标准,
3.引入伸缩
首先看演试编码
#include <iostream>
using namespace std;
using lRef = int&; //左值引入
using rRef = int&&; //右值引用
int main(int argc, char **argv)
{
is_lvalue_reference<lRef &>::value ?
cout << "lRef & 左值引入" << endl :
cout << "lRef & 右值引用" << endl;
is_lvalue_reference<lRef &&>::value ?
cout << "lRef && 左值引入" << endl :
cout << "lRef && 右值引用" << endl;
is_rvalue_reference<rRef &>::value ?
cout << "rRef & 右值引用" << endl :
cout << "rRef & 左值引入" << endl;
is_rvalue_reference<rRef &&>::value ?
cout << "rRef && 右值引用" << endl :
cout << "rRef && 左值引入" << endl;
return 0;
}
调节結果
这就是引入伸缩标准。
这怎么理解呢,看下面的图
能够 见到仅有全是右值引用的情况下才算是右值引用,自然只有一个右值引用的状况下顺理成章也是右值引用。
它是就引入伸缩。
4.极致分享
关键用以主要参数分享时是左值传到或是右转到
考虑到下列编码
#include <iostream>
using namespace std;
template<typename T>
void Fun1(T& v)
{
cout << "左值引入启用" << v << endl;
}
template<typename T>
void Fun1(T&& v)
{
cout << "右值引用启用" << v <<endl;
}
template<typename T>
void Fun(T&& v)
{
Fun1(v);
}
int main(int argc, char **argv)
{
int a = 3;
Fun(a);
return 0;
}
主函数里给Fun传到a,依据上面专业知识,a是一个左值,看调节結果是启用哪一个轻载版本号Fun1
結果跟预期的一样,下面更更换右值传到。
int main(int argc, char **argv)
{
Fun(5);
return 0;
}
调节結果
大家发觉跟想像中不一样!!!
此刻应该怎么办。
c 11中给予了一个用以极致分享的涵数forward。
还给予了一个move函数,用以把左值变为右值的方式。
forward会依据引入伸缩标准得到传到的是左值引入或是右值引用
下面只需变更一下Fun函数,别的的不会改变
template<typename T>
void Fun(T&& v)
{
Fun1(forward<T>(v));
}
调节結果
发觉跟大家预期一样了。
极致分享详细实例
#include <iostream>
using namespace std;
template<typename T>
void Fun1(T& v)
{
cout << "左值引入启用" << v << endl;
}
template<typename T>
void Fun1(T&& v)
{
cout << "右值引用启用" << v <<endl;
}
template<typename T>
void Fun(T&& v)
{
Fun1(forward<T>(v));
}
int main(int argc, char **argv)
{
int a = 1;
Fun(a);
Fun(move(a));
const int b = 2;
Fun(b);
Fun(move(b));
Fun(5);
return 0;
}
调节結果
5.总结
学海无涯。
—End
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0