Ответ здесь основан на результатах поиска Google.
Это сильно зависит от того, что делает ваш класс и как он реализован. Во-первых, для «агрегированных» классов, которые только группируют другие данные для удобства/ясности, конструкторы перемещения будут неявно генерироваться компилятором. Рассмотрим следующий класс.
struct Country {
std::string name;
std::vector<std::string> cities;
};
В типичной структуре C++ многие специальные функции-члены, такие как конструктор копирования, присваивание копии, деструктор, генерируются автоматически. Это также включает в себя конструктор перемещения (и назначение перемещения).
Для более сложных классов, которые инкапсулируют детали своей реализации, ответ будет более интересным. Одной из основных целей семантики перемещения (конструктор перемещения, присваивание перемещения) является предоставление компилятору двух инструментов для реализации семантики значений (передача аргументов по значению, возврат по значению) для пользовательских типов:
- Сделать два одинаковых объекта из одного — это должно быть дорого.
- Перемещение одного объекта из одного места памяти в другое — это можно сделать очень быстро.
Если для вашего класса можно реализовать конструктор перемещения, который будет быстрее, чем конструктор копирования, вам следует реализовать его в целях оптимизации скорости выполнения. Мы видели, как его можно реализовать для вектора в эта ссылка. Однако не для всех типов может быть реализован такой конструктор перемещения, более быстрый, чем конструктор копирования. Рассмотрим следующее матричное представление.
class Matrix {
std::complex<long double> data[1000][1000];
};
Поскольку вся память, необходимая для матричного представления, объявлена в области класса (в отличие от вектора, в котором используется память, распределенная в куче), нет возможности применить только небольшое количество назначений. Нам нужно будет сделать копирование для каждого элемента массива. Нет смысла определять конструктор перемещения, так как это будет не быстрее, чем копирование.
Еще одна веская причина для предоставления конструктора перемещения, если вы хотите, чтобы ваш тип, который нельзя копировать (поскольку он похож на RAII и представляет ресурс), по-прежнему передавался по значению, когда копирование не требуется, и сохранялся в Контейнеры STL. Такая уникальная семантика владения более подробно объясняется в эта ссылка.
int
, который ссылается на определенную часть строки, то при перемещении объекта членint
, вероятно, должен быть сброшен на0
. - person Mooing Duck   schedule 14.06.2013A
вызовет конструктор перемещенияname
иb
(который также является неявным и вызывает конструктор перемещенияlist
). Все двигалось нормально, тебе делать нечего. Напишите свой собственный, еслиA
имеет собственное управление кучей или неперемещаемые элементы (в этом случае вы, вероятно, захотите обрабатывать эти объекты-члены отдельно). - person Pixelchemist   schedule 14.06.2013