Uso de observer_ptr

Qual é exatamente o objetivo da construçãostd::observer_ptr na especificação técnica V2 dos fundamentos da biblioteca?

Parece-me que tudo o que faz é embrulharT*, que parece uma etapa supérflua se não adicionar segurança à memória dinâmica.

Em todo o meu código eu usostd::unique_ptr onde eu preciso tomar posse explícita de um objeto estd::shared_ptr onde posso compartilhar a propriedade de um objeto.

Isso funciona muito bem e evita a desreferenciação acidental de um objeto já destruído.

std::observer_ptr certamente não garante a vida útil do objeto observado.

Se fosse construído a partir de umstd::unique_ptr oustd::shared_ptr Eu veria um uso nessa estrutura, mas qualquer código que simplesmente esteja usandoT* provavelmente continuará fazendo isso e se eles planejam mudar para qualquer coisa, seriastd::shared_ptr e / oustd::unique_ptr (dependendo do uso).

Dada uma função de exemplo simples:

template<typename T>
auto func(std::observer_ptr<T> ptr){}

Onde seria útil se ele impedisse que ponteiros inteligentes destruíssem seu objeto armazenado enquanto estavam sendo observados.

Mas se eu quero observar umastd::shared_ptr oustd::unique_ptr Eu tenho que escrever:

auto main() -> int{
    auto uptr = std::make_unique<int>(5);
    auto sptr = std::make_shared<int>(6);
    func(uptr.get());
    func(sptr.get());
}

O que o torna não mais seguro do que:

template<typename T>
auto func(T *ptr){}

Então, qual é o uso dessa nova estrutura?

É apenas para fonte de auto-documentação?

questionAnswers(6)

yourAnswerToTheQuestion