C ++ Как std :: reference_wrapper неявно преобразуется в ссылку?

Я недавно начал использовать 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 неявно преобразовать в примитивную ссылку, когда она передается в функцию?

2

Решение

reference_wrapper включает в себя (§20.8.3):

// access
operator T& () const noexcept;

Это оператор преобразования, и поскольку он не указан как explicit, это позволяет неявное преобразование из reference_wrapper<T> в T&,

5

Другие решения

Это перегружает этот оператор преобразования:

operator T& () const;

http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/get

5

По вопросам рекламы [email protected]