临时对象有身份吗?

Do Temporary Objects have identity?

本文关键字:身份 临时对象      更新时间:2023-10-16

我一直在质疑自己临时对象是否确实具有身份。我知道以下内容是有效的:

object.temporary_object().modify()

只要返回的对象是非 const 或对象上调用的函数,就不修改不可变成员。

根据值类别定义,prvalue 的结果可以移动但没有标识,并且由于临时对象是prvalue表达式的结果,如何修改它们?

链接的文档不是规范的。从某种意义上说,它似乎描述了价值应该是什么,而不是当时是什么。在 C++17 年,prvalues 确实没有同一性---但在 C++11 和 C++14 中,情况并非如此。

在 C++11 和 C++14 中,类类型的 prvalue确实具有标识,因为正如您所观察到的,可以对其调用方法,并且还有一些方法可以观察其地址。同样,数组类型的 prvalues 具有标识。标量类型的 prvalue(例如,整数文本(没有标识。将它们绑定到引用将导致临时对象的具体化,该对象现在具有地址,但不再可作为 prvalue 进行观察。

在 C++17 中,prvalues 没有标识,也不是临时对象,而是可用于创建临时(或非临时(对象的表达式。从 prvalue 移动到对象可以有效地"调用"prvalue。临时对象只能作为 xvalue 进行观察。

您可以像修改其他任何对象一样修改临时对象。这些修改将毫无意义,因为当临时对象的生命周期结束时,它们会被丢弃并被破坏。

它有点类似于这样的东西:

SomeClass object;
// Some code...
{
// Entering a new scope, the life-time of variables in here ends when the scope ends
SomeOtherClass temporary_object = object.temporary_object();
temporary_object.modify();
// Now the scope ends, and the life-time of temporary_object with it
}
// Here there exists no such things as "temporary_object"

当嵌套作用域结束时,对temporary_objects所做的所有修改都将丢失,并且temporary_object被销毁。


一个重要的免责声明:您可以设计SomeOtherClass(来自上面的示例(以保留指向object的链接(引用或指针(,并且modify()函数可以使用该链接来修改object本身。这些修改在销毁后仍然存在temporary_object因为它们是对object本身而不是temporary_object的修改。