我一直在问自己临时对象是否具有身份。我知道以下内容是有效的:
object.temporary_object().modify()
只要返回的对象是非const或该对象上调用的函数不会修改不可变成员。
根据the value categories definition, prvalue 的结果可以移动,但是没有标识,并且由于Temporary Objects是prvalue表达式的结果,如何修改它们?
答案 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
上进行的修改。