临时对象有身份吗?

Naz*_*nho 0 c++ standards object return-value

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

object.temporary_object().modify()
Run Code Online (Sandbox Code Playgroud)

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

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

Bri*_*ian 5

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

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

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