从函数结果中分配 std::shared_ptr 的一行是什么?

What's the one liner for assigning a std::shared_ptr from the result of a function?

本文关键字:是什么 一行 结果 函数 分配 std shared ptr      更新时间:2023-10-16

必须有一种更惯用的方法可以做到这一点:

Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
std::shared_ptr<Potato> ret;
*ret = SpecialPotato();
return ret;
}
*ret = SpecialPotato();

不会起作用,因为ret只是一个空指针,因为它是默认构造的。 如果要返回指向具有SpecialPotato()返回值的Potatostd::shared_ptr<Potato>,则可以使用类似std::make_shared

std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}

这将动态分配一个Potato,用SpecialPotato()的返回对其进行初始化,然后返回shared_ptr


请注意,如果SpecialPotato()应该返回派生自Potato的类型,则无法返回Potato。 这将对对象进行切片,而您则丢失了对象的派生部分。 将派生类型作为父类型返回时,需要使用类似指针/指针的类型,例如

std::shared_ptr<Potato> SpecialPotato()
{
return std::make_shared<SpecialPotatoType>(/* constructor parameters here */);
}   

使用std::make_shared

Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
return std::make_shared<Potato>(SpecialPotato());
}

它具有一次性构建std::shared_ptr和对象副本的专业版。此外,副本可能会被优化出来。