Reputation: 1110
I've recently begun using the std::reference_wrapper
class. When replacing certain uses of primitive references, I noticed that I did not have to use the get()
function to pass the reference_wrappers as parameters to functions that take a normal reference.
void foo(const T& a);
//...
T obj;
std::reference_wrapper<const T> ref(obj);
foo(ref); //works!
//foo(ref.get()); also works, but I expected that it would be required
How does std::reference_wrapper
implicitly convert to a primitive reference when it is passed into a function?
Upvotes: 2
Views: 2315
Reputation: 53047
It overloads this conversion operator:
operator T& () const;
http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/get
Upvotes: 5
Reputation: 490208
reference_wrapper includes (§20.8.3):
// access
operator T& () const noexcept;
This is a conversion operator, and since it isn't specified as explicit
, it allows implicit conversion from reference_wrapper<T>
to T&
.
Upvotes: 7