Search code examples
c++c++11stdreference-wrapper

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


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.


Solution

  • 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 for std::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