Я пытаюсь обновить код, который передает новый объект. Цель состоит в том, чтобы управлять им с помощью умного указателя. Сложив, это выглядит так:
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, похоже, не возражает против этого. Я предпочел бы иметь точное понимание, прежде чем я начну вносить подобные изменения в других местах, где производительность более критична.