【C++11特性】右值、左值、右值引用、左值引用

缘起

C++是oop语言,所以以对象为组织架构,可能某些对象中并没有实现它的赋值语句,且它并不需要赋值,那么在函数中,需要将之作为入参,我们必须得到它的地址,也就是指针,但是指针操作有风险,那么我们可以使用右值引用。
换言之,我们将该变量直接送到调用函数中,不需要创建临时变量,这也将减少内存开销以及赋值所带来的时间开销

右值、左值

避免无谓的复制,提高了程序性能
避免深拷贝,优化性能
&& 可能是右值引用也可可能是左值引用
& 也可能是左值
左值,是能够被赋值的
右值,是临时的

左值引用,右值引用

  1. 左值引用是左值的别名
  2. 右值引用需要借用移动语义来使用右值

move

move的结果一定是右值

a = MyString("Hello"); // move
MyString b = a; // copy
MyString c = std::move(a); // move, 将左值转为右值

forward

向前引用 ,即当前作用域里面的初始状态作为,比如如下代码, 便是将t转为入参时候的类型。
注释1 调用第一个aaa
注释2 调用第二个aaa
第一个aaa中 T a实质是 c的左值
第二个aaa中 T a实质是 c的右值

template <class T>
void aaa(T & t)
{
    
    
	T a = std::forward(T);
}

void aaa(T && t)
{
    
    
	T a = std::forward(T);
}
int c = 3;
aaa(c);						//1
aaa(std::move(c));	//2

判定左值还是右值的方法

合理使用多态性进行左值右值的判定

template <class T>
bool is_rightValue(T& t)
{
    
    
	return false; //这是左值
}
template <class T>
bool is_rightValue(T&& t)
{
    
    
	return true; //这是右值
}

猜你喜欢

转载自blog.csdn.net/qq_34954047/article/details/123636179
今日推荐