Move semantics — transferring resources instead of copying.
1#include <utility>2#include <iostream>34class Buffer {5private:6 int* data;7 size_t size;89public:10 // Constructor11 Buffer(size_t s) : size(s) {12 data = new int[s];13 std::cout << "Constructed\n";14 }1516 // Destructor17 ~Buffer() {18 delete[] data;19 std::cout << "Destroyed\n";20 }2122 // Copy constructor (expensive)23 Buffer(const Buffer& other) : size(other.size) {24 data = new int[size];25 std::copy(other.data, other.data + size, data);26 std::cout << "Copied\n";27 }2829 // Move constructor (cheap!)30 Buffer(Buffer&& other) noexcept : data(other.data), size(other.size) {31 other.data = nullptr; // Invalidate source32 other.size = 0;33 std::cout << "Moved\n";34 }35};3637int main() {38 Buffer b1(100); // Constructed39 Buffer b2 = b1; // Copied40 Buffer b3 = std::move(b1); // Moved!41} // b3 destroyed, b1 empty
std::move:
When used: