Что такое точка конструкции std::observer_ptr
в технической спецификации библиотеки V2?
Мне кажется, что все, что он делает, это обрезать голый T*
, который кажется излишним, если он не добавит никакой безопасности в динамической памяти.
Во всем моем коде я использую std::unique_ptr
, где мне нужно явно владеть объектом и std::shared_ptr
, где я могу предоставить право собственности на объект.
Это работает очень хорошо и предотвращает случайное разыменование уже разрушенного объекта.
std::observer_ptr
, конечно, не гарантирует гарантии времени жизни наблюдаемого объекта.
Если бы он был построен из std::unique_ptr
или std::shared_ptr
, я бы увидел использование в такой структуре, но любой код, который просто использует T*
, вероятно, будет продолжать делать это, и если они планируют при перемещении на что угодно было бы std::shared_ptr
и/или std::unique_ptr
(в зависимости от использования).
Для простой примерной функции:
template<typename T>
auto func(std::observer_ptr<T> ptr){}
Где было бы полезно, если бы он остановил интеллектуальные указатели на уничтожение их сохраненного объекта во время их наблюдения.
Но если я хочу наблюдать a std::shared_ptr
или std::unique_ptr
, я должен написать:
auto main() -> int{
auto uptr = std::make_unique<int>(5);
auto sptr = std::make_shared<int>(6);
func(uptr.get());
func(sptr.get());
}
Это делает его более безопасным, чем:
template<typename T>
auto func(T *ptr){}
Итак, в чем заключается использование этой новой структуры?
Это только для самодокументирующего источника?