Язык системного программирования Rust использует парадигму собственности для обеспечения во время компиляции нулевой стоимости для среды выполнения, когда ресурс должен быть освобожден (см. "Rust Book" Собственность").
В С++ мы обычно используем интеллектуальные указатели для достижения той же цели - скрыть сложность управления распределением ресурсов. Однако есть несколько отличий:
- В Rust всегда есть только один владелец, тогда как С++ shared_ptr может легко протекать в собственность.
- В Rust мы можем брать ссылки, которыми мы не владеем, тогда как С++ unique_ptr нельзя безопасно использовать с помощью weak_ptr и lock().
- Сопоставление ссылок shared_ptr является дорогостоящим.
Мой вопрос: как мы можем эмулировать парадигму собственности в С++ в следующих ограничениях:
- Только один владелец в любое время
- Возможность заимствовать указатель и использовать его временно, не опасаясь, что ресурс выходит из сферы действия (observer_ptr для этого бесполезно)
- Как можно больше времени проверки компиляции.
Edit: С учетом комментариев до сих пор мы можем заключить:
- Отсутствует поддержка времени компиляции (я надеялся, что неизвестная мне неизвестность/тип магии) в компиляторах. Возможно ли использование статического анализа в другом месте (taint?)
- Невозможно получить это без подсчета ссылок.
- Нет стандартной реализации, чтобы отличать shared_ptrs с семантикой владения или заимствования
-
Мог бы сворачивать свой собственный, создавая типы обложек вокруг shared_ptr и weak_ptr:
- owned_ptr: не копируемый, перемещение-семантика, инкапсуляция shared_ptr, доступ к заимствованному_ptr
- заемный_ptr: копируемый, инкапсулирует weak_ptr, метод блокировки
- locked_ptr: не копируемый, перемещение-семантика, инкапсулирует shared_ptr из блокировки weak_ptr