临时对象有身份吗?
Do Temporary Objects have identity?
我一直在质疑自己临时对象是否确实具有身份。我知道以下内容是有效的:
object.temporary_object().modify()
只要返回的对象是非 const 或对象上调用的函数,就不修改不可变成员。
根据值类别定义,prvalue 的结果可以移动但没有标识,并且由于临时对象是prvalue表达式的结果,如何修改它们?
链接的文档不是规范的。从某种意义上说,它似乎描述了价值应该是什么,而不是当时是什么。在 C++17 年,prvalues 确实没有同一性---但在 C++11 和 C++14 中,情况并非如此。
在 C++11 和 C++14 中,类类型的 prvalue确实具有标识,因为正如您所观察到的,可以对其调用方法,并且还有一些方法可以观察其地址。同样,数组类型的 prvalues 具有标识。标量类型的 prvalue(例如,整数文本(没有标识。将它们绑定到引用将导致临时对象的具体化,该对象现在具有地址,但不再可作为 prvalue 进行观察。
在 C++17 中,prvalues 没有标识,也不是临时对象,而是可用于创建临时(或非临时(对象的表达式。从 prvalue 移动到对象可以有效地"调用"prvalue。临时对象只能作为 xvalue 进行观察。
您可以像修改其他任何对象一样修改临时对象。这些修改将毫无意义,因为当临时对象的生命周期结束时,它们会被丢弃并被破坏。
它有点类似于这样的东西:
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
(来自上面的示例(以保留指向object
的链接(引用或指针(,并且modify()
函数可以使用该链接来修改object
本身。这些修改在销毁后仍然存在temporary_object
因为它们是对object
本身而不是temporary_object
的修改。
- 在不复制临时对象的情况下延长其生存期
- 为什么当我们有常量引用时创建临时对象?
- 程序如何'remember'临时对象?
- 返回对临时对象的引用
- 防止临时对象文件访问 MSVC 中的磁盘
- 是否可以在C++中移动临时对象的属性?
- 通过引用传递临时对象
- 临时C++对象是否为左值?
- 临时对象:术语澄清
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 临时对象有身份吗?
- 临时对象上的运算符重载
- 如何在没有 std::move 的情况下移动临时对象
- 临时对象在C++中是不可避免的吗?
- 编译错误:临时对象构造函数中缺少参数
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 我试图创建临时对象的方式有错误吗
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 为什么引用类型在使用临时对象访问时是左值