Ответ 1
Насколько я понимаю стандарт, std::function
предполагается скопировать. Поэтому вы не можете напрямую достичь того, чего хотите.
Вы можете уйти с какой-то пользовательской оболочкой, я бы предположил. Это будет выглядеть примерно так:
- сделайте вашу обертку содержащей
std::shared_ptr
фактическим функтором; - когда оболочка построена из функтора rvalue, переместите функтор в динамически выделенную память;
- Конструктор копирования для оболочки и деструктора просто обрабатывается
shared_ptr
copy-ctor/destructor; -
operator()
для обертки разыгрывает интеллектуальный указатель на реальный функтор и передает на негоoperator()
.