本文共 1150 字,大约阅读时间需要 3 分钟。
目录
Lvalue与Rvalue可以粗略定义如下:
lvalue: 存储在内存(堆或者栈)中的,可以寻址到的一个值。 rvalue: 不属于lvalue范畴的一个值。它存在于表达式的右侧。大多数的值是一个左值。
int k = 10; //k: lvalueint *pk = &k; //k is addressablek = 10; //can modifyclass dummy {};dummy dy; //dy is an lvalue for a user defined type
那么什么是右值呢?
int k = 11; //k is lvalue but 11 is rvalueint j = k+3; //(k+3) is an rvalueint *pk = &(k+3); //wrong! it is not addressablek + 3 = 10; //wrong! cannot assign a value to it3 = k; //wrong! not assignableclass dummy {};dy = dummy(); //dummy() is an rvalue
另外,函数返回值也是一个右值
int square(int i) { return i*i; }int sq = square(10); //square(10) is an rvalue
基于上述结论,那么一个引用是左值还是右值呢?
事实上,我们一直使用的引用,是一个左值引用 - 引用lvalue! "左值引用仅能与左值绑定,不能绑定右值"!int i;int &r = i;int &r = 8; //wrong! lvalue can not be bound to rvalue 8.
但是,我们可以将一个const左值引用绑定到右值.
const int&r = 7; //OK
这是合法的,因为当编译器看到const时,它会将7转换为lvalue, 再将其赋给一个引用。
对于这条规则,"左值引用仅能与左值绑定,不能绑定右值", 它也同样适用于函数的参数。int square(int &x) { return x*x; }int i=9;square(i); //OKsquare(9); //wrong! 9 is an rvalue and can not be assigned to reference
有没有方法将9传递给函数square?当然有的,可以使用const。
转载地址:http://kmeji.baihongyu.com/