Bin*_*eee 6 c++ static-typing lvalue language-lawyer
简而言之,您可以回答有关身份的部分,谢谢.我对这个问题的主要关注点是从2开始.关于身份,我只是试图提供我当前理解的背景/背景,这样可以帮助你在写答案时决定深度.
我想了解C++中类型系统和值类别的大图.我在网上搜索/阅读了很多问题和资源,但是每个人都有一个明确的解释,所以我真的很困惑.我会列出我无法掌握的部分,如果有人能提出想法的话
对象,引用,函数(包括函数模板特化)和表达式都有一个名为type的属性,它既限制了这些实体所允许的操作,又为其他通用的位序列提供了语义含义.
我的问题:
价值类别:
我读到了这个答案 - 什么是rvalues,lvalues,xvalues,glvalues和prvalues?,这句话困扰我很多是身份,它也出现在cppreference.com上 - 值类别(第5行,glvalue).
我的问题:我可以说identity ==我可以为它分配一个新值吗?
has identity iff has address/pointer?我想要精确的术语.a,它的位字段a.m没有地址?这是使用单词标识而不是地址/指针的原因吗?这identity是一个哲学概念。它是事物的一种属性,使其独一无二。没有两个“事物”可以具有相同的身份。
具有身份的事物就是一个实体。
\n\n\n\n\n\n\n左值是一个表达式,其计算确定对象、位域或函数的标识。
\n
表达式中的名称只能指定一个对象。因此表达式中的名称就是一个身份。它被定义为左值(例如参见expr.prim.id.unqual)
\n\n在给定地址和给定时间,不能有 2 个相同类型的对象(可以有对象嵌套在彼此内部,...)。因此取消引用指针会产生左值。
\n\n引用总是指定一个实体。因此,每个在调用时返回引用的函数都会生成一个泛左值。
\n\n...
\n\nxvalue是一个标签,只能通过强制转换(或绑定到临时物化)生成。它是一个泛左值,表示其资源可以重用的对象或位域 basic.lval
\n\nxvalue和lvalue之间的差异用于生成高效的代码。但xvalue作为lvalue是glvalue:它们带来实体的身份。
\n\n...
\n\n纯右值是不与任何对象关联的表达式的结果。这是调用具有非引用返回类型的函数的结果或某些内置运算符调用的结果。在 C++ 中,表达式不是实体,因此它没有标识。
\n\n纯右值可能有一个结果对象,它可以是一个临时对象。临时对象是一个实体,它在需要时被具体化(当尝试获取对它的引用或纯右值被丢弃时)。
\n\n表达式的类型在 [expr.type] 中明确定义:
\n\n\n\n\n如果表达式最初的类型为 \xe2\x80\x9c 对 T\xe2\x80\x9d ([dcl.ref], [dcl.init.ref]) 的引用,则在进行任何进一步分析之前,该类型将调整为 T。\ n 表达式指定引用所表示的对象或函数,并且表达式是左值或x值,具体取决于表达式。\n [\xe2\x80\x89注意:在引用的生命周期开始之前或之后结束,行为未定义(参见 [basic.life])。\n \xe2\x80\x94\xe2\x80\x89end note\n \xe2\x80\x89]
\n\n如果纯右值最初的类型为 \xe2\x80\x9ccv T\xe2\x80\x9d,其中 T 是 cv 未限定的非类、非数组类型,则在任何进一步的操作之前,表达式的类型将调整为 T分析。
\n
表达式不能具有引用类型。
\n