В текущей реализации std - увы, обязательно. Никаких др способов получить weak нет.
смахивает на какой то бред.
проилюстрируй кодом,
как именно ты собираешься отрезать самолету крылья,
и что в итоге хочешь получить.
ты никогда не думал о том, почему юник называется "юником" ?
Утверждается что
владелец один (и только один). И что? Почему я не могу иметь любое число weak ("потребителей")? Уникальности (единственности владения) это никак не противоречит.
в том то и дело, что противоречит.
ты вообще понимаешь, как работают с weak?
конкретно, ответь на вопрос:
почему напрямую через weak нельзя получить доступ к ресурсу,
а вместо этого приходится сначала расшаривать владельца?
#include <iostream>
#include <memory>
struct data
{
int val = 333;
};
std::shared_ptr<data> holder = std::make_shared<data>();
int main()
{
std::weak_ptr<data> weak = holder;
// так нельзя
// std::cout << "value = " << weak->val << '\n';
// нужно сначала расшарить ресурс:
std::shared_ptr<data> owner = weak.lock();
std::cout << "value = " << owner->val << '\n';
}
это связанно с тем, что поскольку weak не является владельцем,
то он не контролирует время жизни ресурса.
а значит, прямой доступ к ресурсу через него - всё равно что доступ через обычный голый указатель.
те же самые проблемы с безопасностью:
ресурс в любой момент может сдохнуть.
и потом ищи баги по всему коду.
единственный способ гарантировать безопасность - сначала расшарить ресурс.
и теперь, когда на у нас на руках имеется ещё один владелец ресурса,
нам гарантируется, что ресурс не помрет.
однако в случае с unique_ptr, создание второго владельца противоречит самой идее существования юника.
хочешь рассшаривать - используй shared_ptr,
и не морочь голову ни себе, ни людям.
резюмируя:
если ты - наркоман, который не дружит с головой, тогда вот тебе твой weak специально для юника:
auto* weak1 = smart.get();
auto* weak2 = smart.get();
auto* weak3 = smart.get();
но если ты дружишь с головой, то ты понимаешь:
грамотный weak должен быть безопасным.
а безопасным он может только и только если гарантируется,
что ресурс не будет освобожден.
такие гарантии предоставляет shared_ptr
любая попытка сделать безопасный weak для юника приведет к тому,
что из юника получится shared