彻底搞懂C++左值与右值

相信你遇到过不知道多少次rvaluelvalue,但对于像glvaluexvalueprvalue这样的词恐怕你听都没听过,但是要准确把我左值和右值的定义,他们也必须理解清楚。

expression

C++中的所有表达式都是一个值,就像下面这样子的。

1 + 2;  // 表达式;一个对象
3;      // 表达式;一个对象
func(); // 表达式;一个对象
&func;  // 表达式;一个指针

lvalue

左值。能出现在赋值表达式左边的值,同时别被他名字骗了,它也能出现在赋值表达式的右边。

int n = 0;
n = 1;     // n是左值
int m = n; // n是左值

int& func();
func() = 12;   // func函数的返回值是左值

rvalue

右值。只能出现在赋值表达式右边的值,它们分为xvalueprvalue两种。

int n = 0;            // 0是右值; prvalue
int m = std::move(n); // std::move(n)是右值 ; xvalue

prvalue

pure rvalue的缩写,纯右值。C++03之前的所有rvalue都属于这一类,典型代表就是各种字面量literal),比如:1,'a'……还有一般函数的返回值。

int func();
func(); // func函数的返回值是prvalue

xvalue

eXpiring value的缩写,可以理解为快要死掉的值。C++11中把左值通过类型转换变成右值引用时,使用move语义时都会产生xvalue

int n = 0;
int m = static_cast< int&& >(n); // static_cast< int&& >(n)是xvalue
int&& func();
func(); // func函数的返回值是xvalue.
std::move(n); // xvalue

glvalue

generalized lvalue的缩写,包括lvaluexvalue。引入这么个概念是为了强调,具名右值引用虽然作为xvalue,跟其他右值有着本质区别(那就是它可以像左值那样使用)这种现象。

struct A {
  int m;
};
void print(A a)
{
    std::cout<<a.m<<std::endl;
}
int main(int argc, char *argv[])
{
    A a;
    A&& ar = static_cast<A&&>(a);// ar就是具名右值
    print(ar);
    A aa;
    ar = aa;
    print(ar);
}

关系图

关系图

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值