Back to slide -- Keyboard shortcut: 'u'  previous -- Keyboard shortcut: 'p'                unique-pointers-1/p2.cc - Passing unique_ptr as parameter to a function.Lecture 4 - slide 16 : 40
Program 4

// Illustrates how a unique pointer can be passed to a function.
// In f1 by value, and in f2 by const reference.
// Inspired from Stroustrup 4ed, page 989.

#include <iostream>
#include <string>
#include <memory>
#include "point.h"

class SomeProblem{};

// Receives a (unique) pointer p by value, works on the pointed object, and returns it. 
std::unique_ptr<Point> f1(std::unique_ptr<Point> p){
  p->displace(1,1);
  return p;
}

// Receives a (unique) pointer p by const reference, and works on it. (No need for return).
void f2(const std::unique_ptr<Point>& p){
  p->displace(1,1);
}

int main(){

  std::unique_ptr<Point> p0{new Point{1,2}}, p1, p2;
  p1 = move(p0);                 // The pointer to Point{1,2} is moved from p0 to p1.   Must use move!
  p2 = f1(move(p1));             // ... and moved into f1, where the Point is operated on, 
                                 // and the pointer is moved out again via return. 
  std::cout << *p2 << std::endl; // (2,3)

  // The exanple same with f2 that uses a const reference:
  std::unique_ptr<Point> q0{new Point{1,2}}, q1;
  q1 = move(q0);                 // The pointer to Point{1,2} is moved from q0 to q1 
  f2(q1);                        // f2 works directly on q1 via a const reference. 
  std::cout << *q1 << std::endl; // (2,3)
                                 // point deleted (2,3)
                                 // point deleted (2,3)
}