说明
c/c++程序员肯定都知道左值、右值,理解好左值、右值有利于我们更好的使用c++语言。下面是我的学习笔记
概念
- 左值:运算符左边的值(变量),可以被取地址。如:int num = 1; num既是一个左值变量
- 右值:运算符的值并且不能被取地址。如int num = 1; 1是右值。
运算符右侧的值不一定就是右值,一定要同时满足“右侧”和“不能被取址”。
右值在c++11之后
c++11将右值分为纯右值,和将亡值。但是在我们使用的之后统一理解成右值就可以了毕竟c++概念够多了。
- 纯右值
函数返回的临时变量值(当然不包括临时变量的引用)
字面值(1,‘a’等)
lambda表达式 - 将亡值
c++11后关于右值引用的表达式类型,右值引用的出现让我们可以通过引用关联右值,使用即将消亡的右值(将亡值==可以被重新使用的资源对象),对于大块的将亡值,使用右值引用可以复用内存同时减少构造、析构的开销提升程序性能。
int && num = 1; num 即为整形右值引用。
应用举例
右值引用是很好的特性,如果我们使用c++,那就一定要用起来。目前c++标准库都是用移动语义重写,所以没有更好的理由我们一定要使用标准库,即使像交换两个变量值这样简单的功能。
看下c++11之前标准库的swap方法
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
c++11之后
template <class T> void swap (T& a, T& b)
{
T c(std::move(a)); a=std::move(b); b=std::move(c);
}
c++标准库都在使用右值引用,我们有什么理由不开始用起来。