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

object.temporary_object().modify()


只要返回的对象是非常量对象,或者对象上调用的函数都不会修改不可变成员。

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

最佳答案

链接的文档不是规范性的。从某种意义上说,它似乎在描述什么是prvalue,而不是当时的prvalue。在C ++ 17中,prvalue不具有标识是正确的-但是在C ++ 11和C ++ 14中,事实并非如此。

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

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

10-04 10:08