C++11线程指南(3)--右值与左值

来源:互联网 发布:怎么改mac地址 编辑:程序博客网 时间:2024/06/10 17:24
1. Rvalue与Lvalue可以粗略定义如下:
    lvalue: 存储在内存(堆或者栈)中的,可以寻址到的一个值。
    rvalue: 不属于lvalue范畴的一个值。它存在于表达式的右侧。

2. 示例
    大多数的值是一个左值。

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


3. 左值引用与右值引用
    基于上述结论,那么一个引用是左值还是右值呢?
    事实上,我们一直使用的引用,是一个左值引用 - 引用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。
0 0
原创粉丝点击