C++11 представил концепцию lvalue, rvalue и операций перемещения. Пост предполагает знакомство с этими понятиями. После C++11 в список специальных функций-членов были добавлены еще две функции — конструктор перемещения и оператор присваивания перемещения. Эти функции позволяют создавать или назначать класс из rvalue, избегают копирования данных из одной области памяти в другую и обеспечивают значительное повышение производительности.

После введения функций-членов конструктора перемещения и оператора присваивания перемещения правило трех стало правилом пяти. Если нам нужно явно определить какую-либо из специальных функций-членов, мы должны определить все пять из них.

Мы уже видели неявное определение конструктора копирования и оператора присваивания копии. Давайте теперь посмотрим на неявные определения функций перемещения. Поведение по умолчанию неявного конструктора перемещения и оператора присваивания перемещения заключается в выполнении перемещения элементов объекта по элементам.

Неявное определение специальных функций-членов

Приведенное выше определение приводит к рискованному коду. Члены исходного объекта перемещаются в члены нового объекта, но класс об этом не знает. Следовательно, он может попытаться уничтожить ресурсы, которыми он не владеет, после уничтожения. Чтобы преодолеть это, нам нужно оставить исходный объект в состоянии, когда его можно безопасно уничтожить. Давайте теперь посмотрим на явные определения специальных функций-членов, включая определение функций перемещения, которые преодолевают эти проблемы:

Явное определение специальных функций-членов

Посты в этой серии

  1. Правило трех
  2. Копировать и заменять идиомы
  3. Правило пяти
  4. Ключевые слова по умолчанию и удалить
  5. Особые правила генерации участников