临时物化转换 - 术语和概念的混淆

问题描述

您好 stackoverflow 社区,

我刚接触 C++ 几个月,最近我一直在尝试掌握围绕“新”值类别、移动语义,尤其是临时物化的概念。

首先,如何解释术语“临时物化转换”对我来说并不简单。转换部分对我来说很清楚(prvalue -> xvalue)。但是在这种情况下,“临时”究竟是如何定义的呢?我曾经认为临时对象是仅存在的未命名对象 - 从语言的角度来看 - 直到对创建它们的表达式进行评估的最后一步。 但是这个概念似乎与临时对象实际上并不匹配在临时物化、新价值类别等更广泛的背景下。

“临时”一词缺乏明确性,导致我无法判断“临时实现”是实现了的临时还是暂时的实现。我认为是前者,但我不确定。另外:术语临时是否仅用于类类型?

这直接让我想到了下一个困惑点:prvalues 和 xvalues 在临时变量方面扮演什么角色?假设我有一个右值表达式,需要以必须将其转换为 xvalue 的方式进行评估,例如通过执行成员访问。 究竟会发生什么?纯右值是否实际存在(在内存中或其他地方)并且纯右值是否已经是临时的?现在,“临时物化转换”描述为“任何完整类型 T 的纯右值都可以转换为相同类型 T 的 xvalue。此转换通过使用临时对象评估纯右值来从纯右值初始化 T 类型的临时对象作为其结果对象,并在 cppreference.com (https://en.cppreference.com/w/cpp/language/implicit_conversion) 上生成一个表示临时对象的 xvalue 将纯右值转换为 xvalue。这段摘录让我认为纯右值在内存或寄存器中的任何地方都不存在,直到它通过这种转换“具体化”为止。 (另外,我不确定临时对象是否与临时对象相同。)因此,据我所知,这种转换是通过对具有“真实”对象的纯右值表达式求值来完成的。这个对象然后由 xvalue 表达式表示(= 表示?)。内存中会发生什么?右值到哪里去了,现在x值在哪里?

我的下一个问题是关于临时物化的某个部分的更具体的问题。在大约 56:30 由 Kris van Rens 在 YouTube (https://www.youtube.com/watch?v=liAnuOfc66o&t=3576s) 上发表的演讲“了解 C++ 中的值类别”中,他展示了这张幻灯片

Understanding value categories in C++ by Kris van Rens

根据 cppreference.com 所说的关于临时物化编号 1 和 2 的情况是明确的(1:对类 pravlue 的成员访问,2:将引用绑定到纯右值(如在 std::string +operator 中)。

不过,我不太确定数字 3。 Cppreference 说:“请注意,从相同类型的纯右值(通过直接初始化或复制初始化)初始化对象时,不会发生临时物化:此类对象是直接从初始化程序初始化的。这确保了“保证复制省略”。 ” + 运算符返回一个纯右值。现在,这个 std::string 类型的纯右值用于初始化一个 auto(它也应该解析为 std::string)变量。这听起来像是在之前的 cppreference 摘录中讨论的情况。那么临时物化真的发生在这里吗?由其间的 xvalue 表达式“表示”的对象(1 和 2)会发生什么情况?他们什么时候被摧毁?如果 +operator 返回一个纯右值,它是否甚至“存在”于某处?如果 prvalue 甚至不是一个真正的(物化?)对象,那么对象 auto x 如何“直接从初始化程序初始化”(prvalue)?

在大约 40:00 在 YouTube (https://www.youtube.com/watch?v=-dc5vqt2tgA&t=2557s) 上发表的演讲“没有什么比复制或移动更好 - Roger Orr [ACCU 2018]”有几乎相同的例子:

Nothing is better than copy or move

这张幻灯片甚至说在初始化一个变量时会发生临时物化,这显然与上面 cppference 的异常相矛盾。那么什么是真的?

如您所见,我对整个主题感到非常困惑。对我来说,掌握这些概念特别困难,因为我在网上找不到各种统一使用的术语的明确定义。非常感谢您的帮助!

最好的问候, 鲁珀尔特

TL;DR:什么是临时物化转换上下文中的临时物?这是否意味着临时被具体化了,或者它是临时的具体化?也是临时=临时对象?

幻灯片中,3(第一张幻灯片)和 1(第二张幻灯片)是否真的是发生临时物化的点(与 cppreference 所说的关于从相同类型的 pravlues 初始化的内容相冲突)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...