Почему компилятор не генерирует конструктор перемещения автоматически?
Компилятор создает конструктор перемещения, если вы этого не сделаете - по моде.Тем не менее, компилятор не может угадать ваши мотивы, поэтому он не знает, что делает указатель в вашем классе.В частности, он не знает, что указатель присваивает владение памятью и должен быть обнулен.
Верна ли реализация конструктора перемещения?
Конструктор перемещенияправильно 1 но остальная часть класса - нет, вы нарушаете правило из трех : ваш класс нуждается в соответствующем конструкторе копирования и копированииоператор присваивания.
Есть ли лучший способ реализовать конструктор перемещения?
Лучший способ написать конструктор перемещения выглядит следующим образом:
MyClass(MyClass&& rcOther)
: mpiSize(std::move(rcOther.mpiSize))
, miSize2(std::move(rcOther.miSize2))
{
rcOther.mpiSize = 0;
}
Два комментария:
- Почему вы не скопировали участников напрямую, а разыменовали
rcOther.mpiSize
?Хотя это не так, это также не имеет смысла и вводит в заблуждение. - Вам не нужно обнулять целое число, и поскольку это не нужно, этого не следует делать: единственная модификация, которую должен использовать ваш конструктор перемещениявыполнение объекта «удалено» означает отказ от владения его ресурсами, чтобы его можно было уничтожить, не вызывая двукратного удаления ресурсов.
Но еще лучший способ - полагаться на предварительносуществующие объекты .В этом случае вы хотите смоделировать владение памятью.Голый указатель делает это плохо, вы должны использовать вместо него std::unique_ptr
.Таким образом, вам не нужно реализовывать ни деструктор, ни конструктор перемещения, поскольку автоматически сгенерированные методы делают правильные вещи.
1 Caveat См. Ответ Сета для лучшего объяснения, в котором упоминается std::move
(что, однако, в данном конкретном случае запрещено).