栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

深入c++之左值与右值

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/699134.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号