Ваш operator()
возвращает значение, а не ссылку или указатель.Поэтому он возвращает временный.Временные неявно привязываются к && преимущественно (это единственные типы, которые делают это)Поэтому, если для них есть оператор присваивания перемещения, они предпочтут его использовать.
Ваша проблема в том, что вы перестали делать разумные вещи, когда сделали это в своей функции operator()
:
F cpy_f( data );
Конструктор F
, который принимает указатель, использует само значение указателя, эффективно применяя указатель.В этот момент у вас теперь есть два F
экземпляра, которые указывают на одни и те же данные.
Если вы хотите быть разумными, то вы не можете иметьВаш оператор назначения перемещения удаляет указатель.Вам нужно согласовать тот факт, что у вас может быть два F
экземпляра, которые указывают на одно и то же.Эти два должны разделить владение указателем.Итак ... как вы планируете это сделать?
Я бы предложил полностью избавиться от этого конструктора.Это только создаст вам больше проблем.Я бы также предложил использовать std::unique_ptr<int> data;
вместо голого указателя.Таким образом, вам не нужно писать конструктор перемещения / оператор присваивания (хотя вам действительно нужен конструктор копирования / оператор присваивания).