Причина ошибки в том, что нет подходящего оператора присваивания, который можно было бы применить.Единственный кандидат:
reference_wrapper& operator=(const reference_wrapper<T>& x);
A reference_wrapper
действует как ссылка с помощью операторов неявного преобразования:
operator T& () const;
Однако неявное преобразование не произойдет налевая сторона оператора присваивания.
Если вы ожидаете, что этот шаблон будет поддерживать reference_wrapper
, возможно, вы можете обойти это так:
#include <functional>
#include <iostream>
template <class T>
T& get(T& value)
{
return value;
}
template <class T>
T& get(std::reference_wrapper<T>& w)
{
return w.get();
}
template<class T_>
void f(T_ obj)
{
//obj = 2;
get(obj) = 2;
}
int main()
{
int i = 1;
f(std::ref(i));
std::cout << i << '\n';
f(3.14); //at the same time, we want this also to work
}
Почему reference_wrapper
не имеет оператора присваивания для сохраненного типа, не уверен.Версия Boost также не имеет, и они просто говорят, что этот класс «обычно позволяет шаблонам функций работать с неизмененными ссылками».Думаю, это не тот случай.