What would be a "Hello, World!" example for "std::ref"?

Roman picture Roman · Mar 20, 2013 · Viewed 9.4k times · Source

Can somebody give a simple example which demonstrates the functionality of std::ref? I mean an example in which some other constructs (like tuples, or data type templates) are used only if it is impossible to explain std::ref without them.

I found two questions about std::ref here and here. But in the first one it goes about a bug in a compiler and in the second one, examples of use of std::ref do not contain std::ref and they involve tuples and data type templates which make understanding of these examples complex.

Answer

Drew Dormann picture Drew Dormann · Mar 20, 2013

You should think of using std::ref when a function:

  • takes a template parameter by value
  • or copies/moves a forwarding reference parameter, such as std::bind or the constructor for std::thread.

std::ref is a value type that behaves like a reference.

This example makes demonstrable use of std::ref.

#include <iostream>
#include <functional>

void increment( int &x )
{
  ++x;
}

int main()
{
  int i = 0;

  // Here, we bind increment to (a copy of) i...
  std::bind( increment, i ) ();
  //                        ^^ (...and invoke the resulting function object)

  // i is still 0, because the copy was incremented.
  std::cout << i << std::endl;

  // Now, we bind increment to std::ref(i)
  std::bind( increment, std::ref(i) ) ();

  // i has now been incremented.
  std::cout << i << std::endl;
}

Output:

0
1