std::auto_ptr
e std::unique_ptr
são incompatíveis em alguns aspectos e uma queda na substituição em outros. Portanto, nenhuma localização / substituição não é boa o suficiente. No entanto, após um trabalho de localização / substituição, os erros de compilação devem corrigir tudo, exceto casos de canto estranhos. A maioria dos erros de compilação exigirá a adição de um std::move
.
- Variável do escopo da função:
100% compatível, desde que você não o passe por valor para outra função.
- Tipo de retorno:
não é 100% compatível, mas 99% compatível não parece errado.
- Parâmetro de função por valor:
100% compatível com uma ressalva, unique_ptr
s deve ser passado por uma std::move
chamada. Este é simples, pois o compilador reclamará se você não acertar.
- Parâmetro de função por referência:
100% compatível.
- Variável de membro da classe:
Essa é complicada. std::auto_ptr
As cópias semânticas são más. Se a classe não permitir a cópia, haverá std::unique_ptr
uma queda na substituição. No entanto, se você tentou dar à classe uma semântica de cópia razoável, precisará alterar o std::auto_ptr
código de manipulação. Isso é simples, pois o compilador reclamará se você não acertar. Se você permitiu a cópia de uma classe com um std::auto_ptr
membro sem código especial, tenha vergonha e boa sorte.
Em resumo, std::unique_ptr
é ininterrupto std::auto_ptr
. Ele não permite comportamentos em tempo de compilação que geralmente eram erros ao usar a std::auto_ptr
. Portanto, se você usou std::auto_ptr
os cuidados necessários, a mudança para std::unique_ptr
deve ser simples. Se você confiou no std::auto_ptr
comportamento estranho de, precisa refatorar seu código de qualquer maneira.