Я недавно начал использовать std::reference_wrapper
учебный класс. При замене некоторых видов примитивных ссылок я заметил, что мне не нужно использовать get()
функция для передачи reference_wrappers в качестве параметров функциям, которые принимают нормальную ссылку.
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
Как std::reference_wrapper
неявно преобразовать в примитивную ссылку, когда она передается в функцию?
reference_wrapper включает в себя (§20.8.3):
// access
operator T& () const noexcept;
Это оператор преобразования, и поскольку он не указан как explicit
, это позволяет неявное преобразование из reference_wrapper<T>
в T&
,
Это перегружает этот оператор преобразования:
operator T& () const;
http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/get