unique_ptr
não é copiável, é apenas móvel.
Isso afetará diretamente o Teste, que é, em seu segundo exemplo, também apenas móvel e não copiável.
Na verdade, é bom que você use o unique_ptr
que o protege de um grande erro.
Por exemplo, o principal problema com seu primeiro código é que o ponteiro nunca é excluído, o que é muito, muito ruim. Diga, você consertaria isso:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
Isso também é ruim. O que acontece, se você copiar Test
? Haverá duas classes com um ponteiro que aponta para o mesmo endereço.
Quando um Test
é destruído, ele também destrói o ponteiro. Quando o segundo Test
for destruído, ele tentará remover a memória atrás do ponteiro também. Mas ele já foi excluído e obteremos algum erro de runtime de acesso à memória ruim (ou comportamento indefinido se não tivermos sorte).
Portanto, a maneira certa é implementar o construtor de cópia e o operador de atribuição de cópia, para que o comportamento seja claro e possamos criar uma cópia.
unique_ptr
está muito à nossa frente aqui. Ele tem o significado semântico: “ Eu sou unique
, então você não pode simplesmente me copiar. ” Assim, nos impede de cometer o erro de implementar agora os operadores em questão.
Você pode definir o construtor de cópia e o operador de atribuição de cópia para um comportamento especial e seu código funcionará. Mas você é, com razão (!), Forçado a fazer isso.
Moral da história: use sempre unique_ptr
nesse tipo de situação.