C++中值类别定义中的"identity"是什么意思
What's the meaning of "identity" in the definition of value categories in C++
总之,你只回答关于身份的部分,谢谢。我这个问题的主要重点是从2开始。关于身份,我只是试图提供context/background我目前的理解,这样它可以帮助你在写答案时决定深度。
我想了解 C++ 中类型系统和值类别的概况。我searched/read网上有很多问题和资源,但是每个人都有不同的解释,所以我很困惑。我会列出我无法掌握的部分,如果有人可以提供关于
的想法
在 cppreference.com, first line:
Objects, references, functions including function template specializations, and expressions have a property called type, which both restricts the operations that are permitted for those entities and provides semantic meaning to the otherwise generic sequences of bits.
我的问题:
- 表达式有类型是什么意思?是评估后最终结果的类型吗?
- 我现阶段不想学习模板,这会不会妨碍学习基础部分(从你专家的角度)?我花了一些时间才意识到转发引用和右值引用是不同的东西,前者是针对模板的。
值类别:
我读了这个answer of - What are rvalues, lvalues, xvalues, glvalues, and prvalues?, the phrase bother me a lot is identity, which also appears on cppreference.com - Value categories (Line 5, glvalue)。
我的问题:我可以说 identity ==
我可以为其赋予新值的所有内容吗?
- 我看到有人用address/pointer这个词来表示,但那是
has identity iff has address/pointer
吗?我要准确的词。
- 我在阅读cppreference.com时想到了位域的概念,好像给定一个位域结构
a
,它的位域a.m
没有地址?这就是使用身份一词而不是 address/pointer 的原因吗?
- 我找到了a blog post explaining this,但是它的左值定义是违反直觉的:一个左值表示一个资源不能被重用的对象,为什么不呢?
首先,如果你真的想学习C++的formalisms/details,你应该参考标准(或它们的草案);而不是 wiki 页面(这可能正确也可能不正确;尽管 cppreference 通常很好)。参见 Where do I find the current C or C++ standard documents?。
话虽如此,但无需学习 C++ 标准即可使用该语言。实际上,大多数开发人员并不知道,而且可以肯定的是,他们并不打算学习 C++。它们是正式文件,不是teaching/learningmaterial。所以,如果你只是学习 C++,买一本关于它的好书。请参阅 The Definitive C++ Book Guide and List。
What does it mean an expression has a type? Is it the type of the final result after evaluation?
不,它不需要被评估(即在运行时)有一个类型。例如,sizeof expr
的类型为 std::size_t
,但 expr
未计算。
I don't want to learn template at current stage, would this hinder learning about the basic part (from you expert's perspective)? It took me some time to realize that forwarding reference and rvalue reference are different thing, which the former is for template.
其实恰恰相反,如果你想学C++来实际使用,你肯定至少需要学习模板的基础知识(如果只是为了使用标准库而不是完全迷失的话)。
但是,您不需要正式地了解它们如何处理值类型、右值引用或模板本身的所有内容才能进行编程。
the phrase bother me a lot is identity
标准中没有"identity of"的定义。在 C++17 中,它用在几个地方,比如定义 glvalue 时:
— A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
但是,实际上,您可以说 "having identity of" 意味着 "actually existing somewhere in memory (if requested)"。要理解这个术语,最好的办法就是阅读 what Stroustrup wrote:
“has identity” – i.e. and address, a pointer, the user can determine whether two copies are identical, etc.
您也可以从相反的角度考虑:泛右值(具有恒等式的东西)是任何不是纯右值的表达式,如果有帮助的话。
- 表达式的类型是当表达式被求值时其结果的类型。表达式没有 被计算,但所有表达式都有类型。类型是 static 属性.
- 没有身份的准确定义,也没有说明哪些实体有或没有身份。这是一个模糊的概念,最好不要管它。忽略它。有人说对象标识就是它的地址,但是这个概念是没有用的。那为什么不直接谈谈它的地址呢?那么位域呢?它们是没有地址的对象,难道它们没有身份吗?其他人说左值有同一性而右值没有,但它同样是多余的。
identity
是一个哲学概念。正是 属性 使它独一无二的东西。没有两个 "things" 可以具有相同的身份。
有身份的东西就是实体。
A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
表达式中的名称只能指定一个对象。所以表达式中的名称是一个身份。它被定义为 lvalue(例如参见 [=14=])
在给定的地址和给定的时间不能有 2 个相同类型的对象(可以有对象相互嵌套,...)。因此,取消引用指针会得到一个 lvalue.
引用总是指定一个实体。因此,每个在调用时 return 引用的函数都会生成一个 glvalue。
...
xvalue 是一个标签,它只能由强制转换(或绑定到临时物化)生成。它是一个泛左值,表示其资源可以重复使用的对象或位域 basic.lval
xvalue 和 lvalue 之间的差异用于生成高效代码。但是 xvalue as lvalue 是 glvalue:它们带来了实体的身份。
...
A prvalue 是不与任何对象关联的表达式的结果。这是调用具有非引用 return 类型的函数的结果或某些内置运算符调用的结果。在 C++ 中,表达式不是实体,因此它没有标识。
prvalues可能有一个result对象,可以是临时对象。临时是一个实体,它在需要时被具体化(当一个人试图获得对它的引用或当 prvalue 被丢弃时)。
表达式的类型在[expr.type]中明确定义:
If an expression initially has the type “reference to T” ([dcl.ref], [dcl.init.ref]), the type is adjusted to T prior to any further analysis.
The expression designates the object or function denoted by the reference, and the expression is an lvalue or an xvalue, depending on the expression.
[ Note: Before the lifetime of the reference has started or after it has ended, the behavior is undefined (see [basic.life]).
— end note
]
If a prvalue initially has the type “cv T”, where T is a cv-unqualified non-class, non-array type, the type of the expression is adjusted to T prior to any further analysis.
表达式不能有引用类型。
总之,你只回答关于身份的部分,谢谢。我这个问题的主要重点是从2开始。关于身份,我只是试图提供context/background我目前的理解,这样它可以帮助你在写答案时决定深度。
我想了解 C++ 中类型系统和值类别的概况。我searched/read网上有很多问题和资源,但是每个人都有不同的解释,所以我很困惑。我会列出我无法掌握的部分,如果有人可以提供关于
的想法在 cppreference.com, first line:
Objects, references, functions including function template specializations, and expressions have a property called type, which both restricts the operations that are permitted for those entities and provides semantic meaning to the otherwise generic sequences of bits.
我的问题:
- 表达式有类型是什么意思?是评估后最终结果的类型吗?
- 我现阶段不想学习模板,这会不会妨碍学习基础部分(从你专家的角度)?我花了一些时间才意识到转发引用和右值引用是不同的东西,前者是针对模板的。
值类别:
我读了这个answer of - What are rvalues, lvalues, xvalues, glvalues, and prvalues?, the phrase bother me a lot is identity, which also appears on cppreference.com - Value categories (Line 5, glvalue)。
我的问题:我可以说
identity ==
我可以为其赋予新值的所有内容吗?- 我看到有人用address/pointer这个词来表示,但那是
has identity iff has address/pointer
吗?我要准确的词。 - 我在阅读cppreference.com时想到了位域的概念,好像给定一个位域结构
a
,它的位域a.m
没有地址?这就是使用身份一词而不是 address/pointer 的原因吗? - 我找到了a blog post explaining this,但是它的左值定义是违反直觉的:一个左值表示一个资源不能被重用的对象,为什么不呢?
- 我看到有人用address/pointer这个词来表示,但那是
首先,如果你真的想学习C++的formalisms/details,你应该参考标准(或它们的草案);而不是 wiki 页面(这可能正确也可能不正确;尽管 cppreference 通常很好)。参见 Where do I find the current C or C++ standard documents?。
话虽如此,但无需学习 C++ 标准即可使用该语言。实际上,大多数开发人员并不知道,而且可以肯定的是,他们并不打算学习 C++。它们是正式文件,不是teaching/learningmaterial。所以,如果你只是学习 C++,买一本关于它的好书。请参阅 The Definitive C++ Book Guide and List。
What does it mean an expression has a type? Is it the type of the final result after evaluation?
不,它不需要被评估(即在运行时)有一个类型。例如,sizeof expr
的类型为 std::size_t
,但 expr
未计算。
I don't want to learn template at current stage, would this hinder learning about the basic part (from you expert's perspective)? It took me some time to realize that forwarding reference and rvalue reference are different thing, which the former is for template.
其实恰恰相反,如果你想学C++来实际使用,你肯定至少需要学习模板的基础知识(如果只是为了使用标准库而不是完全迷失的话)。
但是,您不需要正式地了解它们如何处理值类型、右值引用或模板本身的所有内容才能进行编程。
the phrase bother me a lot is identity
标准中没有"identity of"的定义。在 C++17 中,它用在几个地方,比如定义 glvalue 时:
— A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
但是,实际上,您可以说 "having identity of" 意味着 "actually existing somewhere in memory (if requested)"。要理解这个术语,最好的办法就是阅读 what Stroustrup wrote:
“has identity” – i.e. and address, a pointer, the user can determine whether two copies are identical, etc.
您也可以从相反的角度考虑:泛右值(具有恒等式的东西)是任何不是纯右值的表达式,如果有帮助的话。
- 表达式的类型是当表达式被求值时其结果的类型。表达式没有 被计算,但所有表达式都有类型。类型是 static 属性.
- 没有身份的准确定义,也没有说明哪些实体有或没有身份。这是一个模糊的概念,最好不要管它。忽略它。有人说对象标识就是它的地址,但是这个概念是没有用的。那为什么不直接谈谈它的地址呢?那么位域呢?它们是没有地址的对象,难道它们没有身份吗?其他人说左值有同一性而右值没有,但它同样是多余的。
identity
是一个哲学概念。正是 属性 使它独一无二的东西。没有两个 "things" 可以具有相同的身份。
有身份的东西就是实体。
A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
表达式中的名称只能指定一个对象。所以表达式中的名称是一个身份。它被定义为 lvalue(例如参见 [=14=])
在给定的地址和给定的时间不能有 2 个相同类型的对象(可以有对象相互嵌套,...)。因此,取消引用指针会得到一个 lvalue.
引用总是指定一个实体。因此,每个在调用时 return 引用的函数都会生成一个 glvalue。
...
xvalue 是一个标签,它只能由强制转换(或绑定到临时物化)生成。它是一个泛左值,表示其资源可以重复使用的对象或位域 basic.lval
xvalue 和 lvalue 之间的差异用于生成高效代码。但是 xvalue as lvalue 是 glvalue:它们带来了实体的身份。
...
A prvalue 是不与任何对象关联的表达式的结果。这是调用具有非引用 return 类型的函数的结果或某些内置运算符调用的结果。在 C++ 中,表达式不是实体,因此它没有标识。
prvalues可能有一个result对象,可以是临时对象。临时是一个实体,它在需要时被具体化(当一个人试图获得对它的引用或当 prvalue 被丢弃时)。
表达式的类型在[expr.type]中明确定义:
If an expression initially has the type “reference to T” ([dcl.ref], [dcl.init.ref]), the type is adjusted to T prior to any further analysis. The expression designates the object or function denoted by the reference, and the expression is an lvalue or an xvalue, depending on the expression. [ Note: Before the lifetime of the reference has started or after it has ended, the behavior is undefined (see [basic.life]). — end note ]
If a prvalue initially has the type “cv T”, where T is a cv-unqualified non-class, non-array type, the type of the expression is adjusted to T prior to any further analysis.
表达式不能有引用类型。