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