text: Одним из способов избежать ошибки перемещения ресурсов является следующий: Получаем новые ресурсы Освобождаем старые ресурсы Присваиваем объекту значения нового ресурса class My_Array { int * array; int count; public: My_Array & operator = (const My_Array & other) { if (this != &other) // защита от неправильного самоприсваивания { // 1: выделяем "новую" память и копируем элементы int * new_array = new int; std::copy(other.array, other.array + other.count, new_array); // 2: освобождаем "старую" память delete array; // 3: присваиваем значения в "новой" памяти объекту array = new_array; count = other.count; } // по соглашению всегда возвращаем *this return *this; } ... }; Тем не менее, если успешный метод обмена доступен для всех членов и класс реализует конструктор копирования и деструктор (согласно Правилу трёх), самым коротким путём реализации присваивания копированием будет следующий способ: public: void swap(My_Array & other) // обмен члена-функции (неудачи быть не должно!) { // обмен всех членов (и базовых субобъектов, если возможно) с other std::swap(array, other.array); std::swap(count, other.count); } My_Array & operator = (My_Array other) // Примечание: аргумент передается по значению! { // обмен this с other swap(other); // по соглашению всегда возвращаем *this return *this; // other уничтожается, освобождая память } Причина, по которой операция = возвращает My_Array& вместо void, проста.