返回对对象构造函数的引用

Returning a reference to an object constructor

本文关键字:引用 构造函数 对象 返回      更新时间:2023-10-16

看一下这段代码:

Foo &Bar::Copy()
{
    return Bar();
}

类Bar继承自Foo,而Foo是一个抽象类。但是当我调用Bar()并返回它时,这样做安全吗?或者我将返回一个局部变量的地址,它将在Copy()函数结束时被释放?

建议不胜感激!

调用Bar();时,调用隐式临时对象的构造函数,返回对该对象的引用。如果您打算创建一个类似Clone()的函数,一个典型的解决方案是使用new在堆上创建克隆。你可以使用一种智能指针来简化生命周期管理。您还可以应用协变返回类型来避免在某些情况下使用签名的类型转换:Bar &Bar::Copy()

您没有返回一个actor。Bar(); 调用函数,创建一个临时对象。然后返回对该临时对象的引用。

由于c++中的tor没有名称,因此不能执行在普通函数中可以执行的许多操作,例如获取/返回指向函数的指针。这里并不完全清楚您真正想要完成的是什么,但是如果您想要返回将构造一个对象的东西,通常需要定义一个调用该actor的静态成员函数,并返回一个指向该静态成员函数的指针。

这是一个未定义的行为,因为临时Bar对象将在;处被销毁。

Foo Bar::Copy()
{
    return Bar();
}

是安全。但是多亏了@Cat Plus Plus和@celtschk,我意识到这种方法会导致切片,失去所有Bar特定的信息。为了保留Bar对象,Copy()必须返回指向该对象的引用或指针。我们又回到了UB的起点。所以Bar必须动态分配,它的引用/指针位于Copy()函数的外部。谁应该负责删除这个动态生成的Bar对象?

#include <memory>
std::shared_ptr<Foo> Bar::Copy()
{
    return std::shared_ptr(new Bar());
}

shared_ptr将自动为您完成此操作。