C++ 临时对象是否具有标识?

C++ 临时对象是否具有标识?,c++,object,return-value,standards,C++,Object,Return Value,Standards,我一直在问自己,临时对象是否具有身份。我知道以下内容是有效的: object.temporary_object().modify() 只要返回的对象是非常量或对该对象调用的函数,就不要修改不可变成员 根据,prvalues结果可以移动,但没有标识,因为临时对象是prvalue表达式的结果,如何修改它们?您可以像修改其他对象一样修改临时对象。当临时对象的生命周期结束并被破坏时,这些修改将被丢弃,因此这些修改将是没有意义的 这有点像这样: SomeClass object; // Some cod

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

object.temporary_object().modify()
只要返回的对象是非常量或对该对象调用的函数,就不要修改不可变成员


根据,prvalues结果可以移动,但没有标识,因为临时对象是prvalue表达式的结果,如何修改它们?

您可以像修改其他对象一样修改临时对象。当临时对象的生命周期结束并被破坏时,这些修改将被丢弃,因此这些修改将是没有意义的

这有点像这样:

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"
嵌套范围结束时,您对
临时对象
所做的所有修改都将丢失,
临时对象
将被销毁



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

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

这有点像这样:

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"
嵌套范围结束时,您对
临时对象
所做的所有修改都将丢失,
临时对象
将被销毁



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

链接的文档不规范。从某种意义上说,它似乎是在描述prvalues应该是什么,而不是它们当时是什么。在C++17中,prvalues没有标识成为事实——但在C++11和C++14中,情况并非如此

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


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

链接文档不规范。从某种意义上说,它似乎是在描述prvalues应该是什么,而不是它们当时是什么。在C++17中,prvalues没有标识成为事实——但在C++11和C++14中,情况并非如此

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


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

可能相关,以便更好地理解标识:@geza谢谢,这个答案帮助我更好地理解xvalue的关系-identity@downvoters你能解释一下-1吗?这个问题对我来说似乎非常合理。可能是相关的,为了更好地理解身份:@geza谢谢,这个答案帮助我更好地理解了关系xvalue-identity@downvoters你能解释一下-1吗?这个问题对我来说是完全合理的。Tangentally和有趣的是,你可以创建一个C++类型,它的行为类似于一个PROVE表达式,但是它本身可以被当作一个与它创建的对象分开的对象:<代码> TeMePrimeStultPROVIEW.F f;运算符STD::代码> >有趣地告诉我,您可以创建一个C++类型,它的行为类似于PROVE表达式,但是它本身可以被看作是与它创建的对象分开的:<代码> TeMePrimeStultPROVIEW.F f;运算符STD::代码>