以下内容是参考书籍以及晚上的内容,整理而成,仅供参考~~
lvalue和rvalue
在计算机的远古时代,变量的lvalue和rvalue是指:lvalue:变量在内存中的位置。通过它能够找到内存中存放的变量(location value);
rvalue:存放在lvalue对应的内存中的东西(register value);
C++中的每个表达式要么是lvalue要么是rvalue。lvalue表示一个内存位置,而rvalue表示计算表达式的结果。
rvalue引用是对有名称变量的引用,并允许变量表示的内存通过lvalue引用来访问。
rvalue引用是对包含表达式结果的内存位置的引用。
lvalue引用:
使用lvalue引用形参,可以编写直接访问调用者实参的函数,避免了按值传递中的隐式复制。若不修改实参,只需要给lvalue引用类型使用const修饰符,以避免意外修改参数。无论是按值传递、按址传递参数或引用都是编译器的规则,我们需要熟悉参数在不同情况下的传递,好的理解方式就是输出地址来观察。
#include <iostream>
using namespace std;
void add_1(int & num)
{
num += 1;
}
int main()
{
int v = 6;
add_1(v);
cout <<"v="<< v << endl;
return 0;
}
输出结果:v=7.
rvalue引用:
首先,举一个报错的例子:
#include <iostream>
using namespace std;
void add_1(int && num)
{
num += 1;
}
int main()
{
int v = 6;
add_1(v);
cout << "v="<<v << endl;
return 0;
}
编译会报错: 无法将左值绑定到右值引用。
因为:lvalue不能通过rvalue引用,有rvalue引用形参的函数只能通过rvalue实参来调用,后面列举正确编译的例子:
#include <iostream>
using namespace std;
void add_1(int && num)
{
num += 1;
cout << "num=" << num << endl;
}
int main()
{
int v = 6;
int s = 4;
add_1(v+s);
cout << "v="<<v << endl;
return 0;
}
运行结果:num=11,v=6.
参考:
http://blog.chinaunix.net/uid-7471615-id-83794.html
http://blog.csdn.net/rogerhe/article/details/6410993
http://www.cnblogs.com/yunqie/p/5892252.html