【发布时间】:2019-09-25 10:30:42
【问题描述】:
我正在尝试更新一些交付新对象的代码。目标是使用智能指针对其进行管理。归结起来,它看起来很像这样:
class X
{
shared_ptr<Y> yptr;
X() : yptr(Y::create(new Z())){}
};
class Y
{
Z* zptr;
static shared_ptr<Y> create(Z* zp)
{
if(!zp) return nullptr;
else return shared_ptr<Y>(new Y(zp));
}
Y(Z* zp) : zptr(zp){}
}
到目前为止,这似乎有效:
class X
{
shared_ptr<Y> yptr;
X() : yptr(Y::create( std::move( std::make_unique<Z>(Z()) ) )){}
};
class Y
{
unique_ptr<Z> zptr;
static shared_ptr<Y> create(unique_ptr<Z> zp)
{
if(!zp) return nullptr;
else return shared_ptr<Y>(new Y(std::move(zp)));
}
Y(unique_ptr<Z> zp) : zptr(std::move(zp)){}
}
我的问题是,第一个 std::move() (围绕 make_unique)是否必要? Visual Studio 似乎并不介意任何一种方式。在开始对性能更为关键的其他地方进行类似更改之前,我宁愿有一个准确的了解。
【问题讨论】:
-
如果你真的想要
std::shared_ptr,那么使用std::make_shared()有什么问题? -
std::move所做的只是将对象转换为纯右值。如果对象已经是纯右值(例如,它没有名称......它是临时的),那么std::move是多余的。 -
@πάντα-ῥεῖ 所涉及的代码是一个工厂方法,它在创建时分配其成员。它返回的对象旨在成为由 unique_ptr 管理的项目的唯一所有者。在这种情况下,shared_ptr 可以工作,但它背叛了意图。
-
@françois-andrieux 是的,我会调整上面的。 :)
标签: c++ c++14 smart-pointers