Com a chegada do novo padrão (e peças já disponíveis em alguns compiladores), o novo tipo std::unique_ptr
deve ser um substituto std::auto_ptr
.
O uso deles se sobrepõe exatamente (para que eu possa localizar / substituir globalmente no meu código (não que eu faria isso, mas se o fizesse)) ou devo estar ciente de algumas diferenças que não são aparentes na leitura da documentação?
Além disso, se for um substituto direto, por que dar um novo nome ao invés de apenas melhorar o std::auto_ptr
?
fonte
std::auto_ptr
estd::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 umstd::move
.100% compatível, desde que você não o passe por valor para outra função.
não é 100% compatível, mas 99% compatível não parece errado.
100% compatível com uma ressalva,
unique_ptr
s deve ser passado por umastd::move
chamada. Este é simples, pois o compilador reclamará se você não acertar.100% compatível.
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 ostd::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 umstd::auto_ptr
membro sem código especial, tenha vergonha e boa sorte.Em resumo,
std::unique_ptr
é ininterruptostd::auto_ptr
. Ele não permite comportamentos em tempo de compilação que geralmente eram erros ao usar astd::auto_ptr
. Portanto, se você usoustd::auto_ptr
os cuidados necessários, a mudança parastd::unique_ptr
deve ser simples. Se você confiou nostd::auto_ptr
comportamento estranho de, precisa refatorar seu código de qualquer maneira.fonte
AFAIK,
unique_ptr
não é um substituto direto. A principal falha que ele corrige é a transferência implícita de propriedade.Por outro lado,
unique_ptr
terá recursos completamente novos: eles podem ser armazenados em contêineres.fonte
auto_ptr
não são permitidos.Herb Sutter tem uma boa explicação sobre GotW # 89 :
Em outras palavras, enquanto uma pesquisa e substituição global pode "interromper" seu código temporariamente, você deve fazê-lo de qualquer maneira: pode levar algum tempo para corrigir os erros de compilação, mas poupará muito mais problemas a longo prazo.
fonte