Back to slide -- Keyboard shortcut: 'u'                      references/swap1.cc - Two versions of swap - with Lvalue references and Rvalue references.Lecture 2 - slide 22 : 29
Program 1

// Illustrates move semantics (with rvalue references) in swap. One without, and one asking for use of move semantics.

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
void swap(T& a, T& b){
  T temp {a};              // COPIES a to temp
  a = b;                   // COPIES b to b
  b = temp;                // COPIES temp to b
}

template<typename T>
void swap1(T& a, T& b){    // move forces a Rvalue reference
  T temp {move(a)};        // MOVES a to temp 
  a = move(b);             // MOVES b to a
  b = move(temp);          // MOVES temp to b
}

template<typename T>
void print_vector(const vector<T>& vec){
  for(auto e: vec) cout << e << " ";
  cout << endl << endl;
}

int main(){
  vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9},  // Two 'large' vectors
              w{5, 2, 0};                 

  print_vector(v);     // 1 2 3 4 5 6 7 8 9
  print_vector(w);     // 5 2 0
  swap(v, w);          // Uses swap by copying
  print_vector(v);     // 5 2 0
  print_vector(w);     // 1 2 3 4 5 6 7 8 9

  print_vector(v);     // 5 2 0
  print_vector(w);     // 1 2 3 4 5 6 7 8 9
  swap1(v, w);         // Uses swap by moving
  print_vector(v);     // 1 2 3 4 5 6 7 8 9
  print_vector(w);     // 5 2 0
}