Создаются ли конструкторы перемещения автоматически?

У меня есть большой класс, содержащий множество контейнеров STL.
Будет ли компилятор автоматически создавать конструктор перемещения, который будет перемещать эти контейнеры в цель, или мне придется создать свой собственный?


person Dani    schedule 27.11.2011    source источник


Ответы (2)


Конструктор перемещения для класса X неявно объявляется как используемый по умолчанию именно тогда, когда

  • X не имеет объявленного пользователем конструктора копирования,
  • X не имеет объявленного пользователем оператора присваивания копии,
  • X не имеет объявленного пользователем оператора присваивания перемещения,
  • X не имеет деструктора, объявленного пользователем, и
  • конструктор перемещения не будет неявно определен как удаленный.

Так, например, если в вашем классе есть член данных типа класса, который не имеет конструктора перемещения, ваш класс не получит конструктор перемещения, даже если в нем не объявлен конструктор копирования/перемещения, потому что неявно объявленный конструктор перемещения будет быть определен как удаленный (из-за этого члена данных).

person Johannes Schaub - litb    schedule 27.11.2011
comment
Интересно, что объявленный пользователем конструктор перемещения не мешает компилятору неявно объявлять конструктор копирования. Пожалуй, это стоит упомянуть здесь. По крайней мере, это то, что cprogramming.com/c++11/ говорит. - person Tobias; 28.04.2014
comment
Интересно, что все члены должны иметь конструктор перемещения. Кажется разумным переместить все элементы, которые можно переместить, и скопировать те, которые нельзя. - person Kevin Cox; 12.08.2014
comment
Поэтому лучше всего определить команду перемещения для себя, не полагаясь на компилятор. - person Deqing; 22.09.2016
comment
И указанный член класса не будет иметь неявного конструктора перемещения, потому что один или несколько элементов в приведенном выше списке не были выполнены. - person wulfgarpro; 09.03.2017
comment
@KevinCox Обычно гарантируется, что конструктор перемещения не выдает исключение, в то время как конструктор копирования часто может (например, из-за нехватки памяти), так что это может быть плохой идеей. Вы можете возразить, что это нормально, неявный конструктор перемещения просто не будет noexcept, но я все еще думаю, что есть потенциал для неожиданностей (т.е. ошибок). - person Arthur Tacca; 25.08.2017
comment
Итак, если я перемещаю класс, который не имеет автоматически сгенерированного конструктора перемещения, то используется автоматически сгенерированный конструктор копирования? :/ - person anton_rh; 06.02.2018
comment
Вероятно, лучше использовать явно заданные по умолчанию конструкторы перемещения: " title="является конструктором перемещения по умолчанию, эквивалентным конструктору перемещения по элементам"> stackoverflow.com/questions/18290523/ - person anton_rh; 06.02.2018

Конструкторы перемещения по умолчанию обычно привязаны к конструкторам копирования по умолчанию. Вы получаете одно, когда получаете другое. Однако если вы пишете конструктор копирования/оператор присваивания, то никакие конструкторы/операторы присваивания копирования и перемещения по умолчанию не пишутся. Если вы пишете один из любого набора, вы должны написать их все.

person Nicol Bolas    schedule 27.11.2011