Отключить преобразование из std::weak_ptr в std::shared_ptr

Я знаю, что могу "продвигать" weak_ptr в shared_ptr как это:

// std::weak_ptr<T> weak;
std::shared_ptr<T> promoted(weak);

У меня вопрос: можно ли это как-то предотвратить?

В качестве упражнения я хотел создать собственную очень простую реализацию WeakPtrFactory. Инициируется с this как член класса, а затем икру weak_ptrs, которые будут признаны недействительными при уничтожении объекта. Моя попытка просто использовалась shared_ptr как частный член и вернулся weak_ptrs, созданные с его помощью (на всякий случай не передается операция удаления). Но у этого есть очевидный недостаток, так как каждый может просто продвинуть их назад к shared_ptr и сломать весь механизм.

1 ответ

Решение

Следуя совету @user2357112 я завернул std::weak_ptr внутренне создать std::shared_ptr при необходимости и уничтожить его сразу после использования.

Я, наверное, должен уточнить, что я хотел добиться упрощенной версии этой концепции. Хотя это имеет похожее название это WeakPtr имеет другой случай использования shared_ptrодин. Он используется для того, чтобы проверять не потокобезопасным способом, что какой-либо объект был / не был уничтожен, чтобы мы могли предпринять соответствующие действия. Программист обязан убедиться, что, если объект все еще жив, он может безопасно использовать его (например, путем проверки его существования и вызова его методов в том же потоке).

Другие вопросы по тегам