返回对对象构造函数的引用
Returning a reference to an object constructor
看一下这段代码:
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
将自动为您完成此操作。
相关文章:
- 在类构造函数中传递对外部函数的引用
- 在 c++ 中将变量作为结构构造函数中的引用传递
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 移动构造函数和右值引用
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- C++:右值引用构造函数和复制省略
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 引用构造函数时链接失败
- 为什么调用转发引用构造函数而不是复制构造函数?
- 为什么使用已删除的右值引用构造函数?
- 对 std::Optional 的转发引用构造函数的约束
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 我是否应该对非引用构造函数参数手动调用move
- 使用左值引用错误地调用了Rvalue引用构造函数
- C++未定义的引用构造函数错误
- 调用左值引用构造函数而不是右值引用构造函数
- C++引用构造函数语法
- 不能引用构造函数的地址