左值引用和右值引用
- 左值引用:int&
- 右值引用:int&&
左值和右值的区别:
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。
左值一定在内存中,右值有可能在内存中也有可能在寄存器中。
区别
我没测试之前,就迷迷糊糊的,测试之后就更迷了。不过可以得到如下结论,欢迎大家解释原因哈。
使用时的区别
- 用起来就是一个用“&”,一个用“&&”
- 左值引用一定是左值,int& d=5;是不可以的,因为5是右值,5并没有名字,在使用它之前我们不能通过名字来找到它;
- 右值引用一定是右值,int && c=a;也是不可以的,因为a是一个已经分配了内存的变量,a有名字,是一个左值。
- 右值引用并不是不能修改,比如,int&& c=3;c++;就是可以的,结果c=4;
传参时的区别
- 传递参数的时候,如果输入的是一个数字,则会匹配右值引用的函数,比如test(1),会匹配test(int&& x),因为1是一个没有名字的变量;除此之外,全部会匹配test(int& x);私以为,其他的虽然是引用别的左值或右值,但是他们都有名字了,所以就会被当做左值。
- test03(int&& x)不能接受除纯数字之外的其他参数,只能test03(1),什么test03(a),test03(b)都不行,因为他们都有名字。
- test02(int& x)不能接受纯数字,只要是变量名就接受
- test01(int x)可以接受以上所有,既可以接受纯数字,也可以接受a、b、c这些变量名。
代码输出如下:
测试代码如下:
#include<iostream>
using namespace std;
int test(int & x) {//左值引用
cout << "左值引用x=" << x << endl;
return 0;
}
int test(int && x) {//右值引用
cout << "右值引用x=" << x << endl;
return 0;
}
void test01(int x) {//传入左值右值引用和数字均可
cout << "test01直接传参x=" << x << endl;
}
void test02(int &x) {//传入有名字的变量,不能传入数字
cout << "test02左值引用x=" << x << endl;
}
void test03(int &&x) {//只能传入数字
cout << "test03右值引用x=" << x << endl;
}
int main() {
int a = 2;
int & b = a;//左值引用
//int && c = a;//编译报错:无法将“int”转化为“int&&”,不能将左值引用转化为右值引用
int && c = 3;//右值引用
//int & d = 5;//编译错误
c++;
//int & d = 4;//编译报错:无法将“int”转换为“int&”,非常量的初始化必须为左值
printf("int a = 2;\nint & b = a;\nint && c = 3;\n");
printf("a=%d,b=%d,c=%d\n", a, b, c);
test(1);
test(a);
test(b);
test(c);
cout << "=================== 测试 1 =====================" << endl;
test01(1);
//test02(1);//编译错误
test03(1);
cout << "=================== 测试 a =====================" << endl;
test01(a);
test02(a);
//test03(a);//编译错误
cout << "=================== 测试 b =====================" << endl;
test01(b);
test02(b);
//test03(b);//编译错误
cout << "=================== 测试 c =====================" << endl;
test01(c);
test02(c);
//test03(c);//编译错误
system("pause");
return 0;
}