Этот вызов
vector.push_back(d);
не вызывает ваш конструктор перемещения, поскольку d
не является ссылкой на r-значение. Было бы плохо, если бы конструкторы перемещения вызывались для ссылок, не имеющих значения r, потому что это вырвало бы кишки из объектов, которые должны оставаться нетронутыми. Вам нужно привести к r-значению, чтобы сделать явным, что вам больше не нужен d
. И это то, что делает std::move
(на самом деле это не что иное, как приведение):
vector.push_back(std::move(d));
Однако конструктор перемещения по умолчанию TestData
не делает правильных действий. После строки выше ptr
все еще принадлежит перемещенному объекту, что приводит к двойному удалению. Вы можете предотвратить это, и проблема с тем, что ваша строка не заканчивается на ноль, используя std::string
в качестве члена вместо char *
.