Предположим, что у вас есть функция, которая возвращает существенный объект:
Matrix multiply(const Matrix &a, const Matrix &b);
Когда вы пишете такой код:
Matrix r = multiply(a, b);
, тогда обычный компилятор C ++ создаст временную объект для результата multiply()
, вызовите конструктор копирования для инициализации r
, а затем уничтожьте временное возвращаемое значение. Перемещение семантики в C ++ 0x позволяет вызвать «move constructor» для инициализации r
путем копирования его содержимого, а затем отменить временное значение без его разрушения.
Это особенно важно, если (как, например, пример Matrix
выше), копируемый объект выделяет дополнительную память в куче для хранения своего внутреннего представления. Конструктор копирования должен либо сделать полную копию внутреннего представления, либо использовать семантику ссылок и семантику копирования на запись. Конструктор перемещения оставил бы кучную память и просто скопировал указатель внутри объекта Matrix
.