Согласно стандарту C ++ 17 (12.8 Копирование и перемещение объектов класса)
7 Если в определении класса явно не объявляется конструктор копирования, он объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный конструктор копирования определяется как удаленный; в противном случае он определяется как значение по умолчанию (8.4). Последний случай считается устаревшим, если класс имеет объявленный пользователем оператор присваивания копии или объявленный пользователем деструктор.
Также конструктор перемещения определяется как удаленный хотя бы потому, что там явно определен оператор присваивания копии.
Таким образом, вам необходимо явно определить конструктор копирования, который требуется operator +
для формирования возвращаемого объекта.
Обратите внимание на это определение класса имеет и другие недостатки. Например, член данных name
может быть равен nullptr
. Это разрешено конструктором по умолчанию. В этом случае оператор присваивания cppy может вызвать неопределенное поведение из-за этого оператора
this->name = new char[strlen(temp.name) + 1];
^^^^^^^^^^^^^^^^^
И строковые литералы имеют типы постоянных массивов символов. Таким образом, первый параметр конструктора по умолчанию должен быть объявлен как имеющий тип const char *
.