深入c++之左值与右值

深入c++之左值与右值,第1张

深入c++之左值与右值

什么是左值什么是右值,通俗点来说就是可以放在等号左边的就是左值,可以放在等号右边的为右值。

但是c++很复杂

const int x=3;
x=4;

很明显在const修饰下,x=4是不被允许的,这也就是x这个左值不能放在等号的左边。

int i;

说i是左值还是右值,必须把i放在表达式里讨论,这样只是声明了一个int型的i,并不能说i现在是什么类型。

int i;
i=1;

i=1,就是对i的那一块内存进行 *** 作,这时候i=1;就是一个表达式,可以说明i是左值,1是右值。

对于整个的左值和右值的概念还有更加详细的分类,就像上图一样。

解析一下这个图,在表达式expression先分成glvalue和rvalue

glvalue:相当于左值的扩展

  • 泛左值 (glvalue)(“泛化 (generalized)”的左值)是其求值确定一个对象、位域或函数的个体的表达式;

prvalue:

  • 纯右值 (prvalue)(“纯 (pure)”的右值)是求值符合下列之一的表达式:
    • 计算某个运算符的 *** 作数的值或为 void 表达式(这种纯右值没有结果对象
    • 初始化某个对象或位域(称这种纯右值有一个结果对象)。除 decltype 外,所有类和数组的纯右值都有结果对象,即使它被舍弃也是如此。结果对象可以是变量,由 new 表达式创建的对象,由临时量实质化创建的临时对象,或者前述三类对象的成员;

这个简单来说就是,用于初始化对象或者作为 *** 作数。

int i=2;

这个2就是纯右值,用于初始化对象i;

int i=int{};

int{}是可以做纯右值的,没想到吧。这就是 *** 作数做纯右值。

接下来看最中间的那个xvalue:

  • 亡值 (xvalue)(“将亡 (expiring)”的值)是代表其资源能够被重新使用的对象或位域的泛左值;
struct str
{
  int x;
}
int main()
{

  str().x;
}

str().x是什么意思,从str当中取出x的那一块,这时候就得把str看做xvalue了。这样的话才能标识一个对象,这个.也是一个 *** 作符。

那么整个就清晰明了,lvalue就是属于泛左值,但是不是亡值。

而左值和右值也是能够相互转换的如

int x=1;
int y=x;

在这个情况下,x从一个左值就转为右值,这个是编译器自动给转换的。

还有一种转换方式,Temporary Materrialization

void fun(const int& p)
{

}
int main()
{
 fun(3);
}

fun里面需要的形参是一个引用,引用一定要绑定在一个具体的对象上面。

3只是一个数值,这里将其转换为xvalue。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5699260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存