unique_ptr
не копируется, его можно только перемещать.
Это напрямую повлияет на Test, который во втором примере также только перемещается и не копируется.
На самом деле хорошо, что вы используете то, unique_ptr
что предохраняет вас от большой ошибки.
Например, основная проблема с вашим первым кодом заключается в том, что указатель никогда не удаляется, что очень, очень плохо. Скажем, вы бы исправили это:
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;
}
Это тоже плохо. Что будет, если скопировать Test
? Будет два класса, у которых есть указатель, указывающий на один и тот же адрес.
Когда один Test
будет уничтожен, он также уничтожит указатель. Когда ваш второй Test
будет уничтожен, он также попытается удалить память за указателем. Но он уже был удален, и мы получим некоторую ошибку времени выполнения с плохим доступом к памяти (или неопределенное поведение, если нам не повезет).
Итак, правильный способ - реализовать конструктор копирования и оператор присваивания копии, чтобы поведение было ясным, и мы могли создать копию.
unique_ptr
здесь далеко впереди нас. Он имеет семантическое значение: « Я есть unique
, поэтому вы не можете просто скопировать меня». Таким образом, он предотвращает ошибку, связанную с реализацией имеющихся операторов.
Вы можете определить конструктор копирования и оператор присваивания копии для особого поведения, и ваш код будет работать. Но вы по праву (!) Вынуждены это делать.
Мораль истории: всегда используйте unique_ptr
в подобных ситуациях.