临时对象是否具有身份?

时间:2018-09-13 16:56:20

标签: c++ object return-value standards

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

object.temporary_object().modify()

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

根据the value categories definition prvalue 的结果可以移动,但是没有标识,并且由于Temporary Objects是prvalue表达式的结果,如何修改它们?

2 个答案:

答案 0 :(得分:4)

链接的文档不是规范性的。从某种意义上说,它似乎在描述什么是prvalue,而不是当时的prvalue。在C ++ 17中,prvalue没有身份成为了事实,但是在C ++ 11和C ++ 14中,事实并非如此。

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

在C ++ 17中,prvalue没有身份,并且不是临时对象,而是可用于创建临时(或非临时)对象的表达式。从prvalue移到对象可以有效地“调用” prvalue。临时对象只能作为xvalue观察到。

答案 1 :(得分:0)

您可以像其他任何对象一样修改临时对象。当临时对象的生存期结束并被破坏时,这些修改将被丢弃,而没有任何意义。

有点类似于这样:

convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg

当嵌套作用域结束并且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 link (引用或指针),以及{{1 }}函数可以使用该链接修改object本身。 那些修改在modify()被销毁后仍然存在,因为它们是在object本身而不是temporary_object上进行的修改。