C++
里的表达式分为左值和右值,最初这是根据表达式在赋值运算=
的左边还是右边区分的,但随着C++
的发展,对左值右值的定义有了一些变化。
一种说法是,左值表达式是可以取其地址的(使用&
运算符);而右值表达式不行。
现代C++
中,对左右值有更复杂的分类:
简单来讲,lvalue
是左值(可对其取地址);xvalue
和prvalue
是右值。
prvalue
包括临时对象、非字符串常量的字面值等;
xvalue
包括std::move()
的返回值等。
对某个具体的类型X
,X&
只能接收左值,X&&
只能接收右值,const X&
既能接收左值也能接收右值。