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条)

刀客源码 游客评论