У меня большой класс, в котором много контейнеров STL.
Будет ли компилятор автоматически создавать конструктор перемещения, который будет перемещать эти контейнеры в цель или я должен сделать свой собственный?
Производятся ли конструкторы перемещения автоматически?
Ответ 1
Конструктор перемещения для класса X неявно объявляется как дефолт точно, когда
- X не имеет объявленного пользователем конструктора копирования,
- X не имеет объявленного пользователем оператора назначения копирования,
- X не имеет объявленного пользователем оператора назначения перемещения,
- X не имеет объявленного пользователем деструктора и
- конструктор перемещения не будет неявно определен как удаленный.
Так, например, если ваш класс имеет элемент данных типа класса, у которого нет конструктора перемещения, ваш класс не получит конструктор перемещения, даже если у него нет объявленного конструктора копирования/перемещения, поскольку неявно объявлено move constructor будет определен как удаленный (из-за этого элемента данных).
Ответ 2
Конструкторы перемещения по умолчанию обычно привязаны к конструкторам копии по умолчанию. Вы получаете его, когда получаете другого. Однако, если вы пишете оператор-конструктор копирования/присваивания, то никакие операции копирования и перемещения по умолчанию не выполняются. Если вы пишете один из наборов, вы должны записать их все.