#include <memory>
struct a {};
struct b : public a {};
std::shared_ptr<b> get()
{
std::shared_ptr<a> temp(new b);
return std::static_pointer_cast<b>(temp); // atomic ref-count inc/dec
}
Насколько я знаю, единственный способ понизить значение shared_ptr — static_pointer_cast. Однако он принимает только константную ссылку и создает уменьшенную копию аргумента. Я хочу избежать копирования, если это возможно, потому что создание копии и уничтожение shared_ptr подразумевает атомарную операцию увеличения / уменьшения.
Есть некоторые конструкторы перемещения, которые используют другой экземпляр shared_ptr, но они не поддерживают downcast.
Можно ли избежать копирования стандартным образом?
Нет, нет способа избежать копирования.
Это потому, что нет наследственных отношений между std::shared_ptr<a>
а также std::shared_ptr<b>
, так что вы не можете произвольно конвертировать между ними.
Если вы хотите стать владельцем (путем перемещения) указателя, передаваемого в конструктор, почему бы не использовать unique_ptr
вместо? Если ты не взятие собственности не передает это как умный указатель вообще.
Других решений пока нет …