Возможно ли отключить shared_ptr без копирования?

#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.

Можно ли избежать копирования стандартным образом?

2

Решение

Нет, нет способа избежать копирования.

Это потому, что нет наследственных отношений между std::shared_ptr<a> а также std::shared_ptr<b>, так что вы не можете произвольно конвертировать между ними.

Если вы хотите стать владельцем (путем перемещения) указателя, передаваемого в конструктор, почему бы не использовать unique_ptr вместо? Если ты не взятие собственности не передает это как умный указатель вообще.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]