Если вы внимательно следите за описанием, которое вы связали, вы увидите, что у вас должна быть только одна перегрузка operator=
, и что нужно принимать аргумент по значению. Таким образом, простое устранение перегрузки operator=(I_hold_reference&&)
сделает ваш код компилируемым.
Однако это не единственная проблема. Ваш swap
не поменяется! Вместо этого он назначает копию second
для first
и оставляет second
нетронутым.
Это то, что вы хотите:
class I_hold_reference
{
I_hold_reference(const int& number_reference)
: my_reference(number_reference){}
friend void swap(I_hold_reference& first, I_hold_reference& second)
{
using std::swap;
swap(first.my_reference, second.my_reference);
}
I_hold_reference& operator=(I_hold_reference other)
{
swap(*this, other);
return *this;
}
private:
reference_wrapper<const int> my_reference;
};
Примечание: я удалил ненужные inline
s как функции-члены неявно встроены. Также я объявил функцию swap
внутри вашего класса. Вы можете найти объяснение этому в ссылке, которой вы поделились.
Кроме того, в этом конкретном примере использование идиомы копирования и замены не является необходимым в первую очередь. std::reference_wrapper
не является обслуживаемым вручную ресурсом, а это означает, что в него встроена надлежащая семантика копирования и перемещения. Поэтому в этом конкретном примере сгенерированные компилятором операторы копирования и перемещения будут работать точно так же, как и созданные вручную. Таким образом, вы должны использовать их, а не писать свои собственные каким-либо образом. С другой стороны, если это всего лишь игрушечный пример и в реальном классе ресурсов * на 1020 * больше, которые требуют ручного управления, то это путь.