You should think of using std::ref
when a function:
- takes a template parameter by value
- copies/moves a template parameter, such as
std::bind
or the constructor forstd::thread
.
std::ref
creates a copyable value type that behaves like a reference.
This example makes demonstrable use of std::ref
.
#include <iostream>
#include <functional>
#include <thread>
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;
// The same applies for std::thread
std::thread( increment, std::ref(i) ).join();
std::cout << i << std::endl;
}
Output:
0
1
2