если я передам простой int или строку, все в порядке. но когда я передаю unique_ptr, он перемещается внутри объекта привязки (bind_f), и я не могу вызвать bind_f();
#include <iostream>
#include <memory>
#include <functional>
using namespace std;
template <typename F, typename... Args>
void TestF(F&& fnc, Args&&... args) {
auto bind_f = std::bind(std::move(fnc), std::move(args)...);
bind_f(); // error: no match for call to '(std::_Bind<main()::
// <lambda(std::unique_ptr<int>)>(std::unique_ptr<int>)>) ()'
// [build] 383 | bind_f();
// [build] | ~~~~~~^~
}
int main() {
std::unique_ptr<int> ptr = std::make_unique<int>(11);
auto work = [](std::unique_ptr<int> val) {
cout << *val << endl;
};
auto work2 = [](int val, std::string str) {
cout << val << endl;
};
TestF(std::move(work2), 10, "ssdf"s);
TestF(std::move(work), std::move(ptr));
cout << "done" << endl;
}
Вы можете использовать auto work3 = [ptr = std::move(ptr)]() { std::cout << *ptr << std::endl; }; TestF(work3);





Это связано с тем, что возвращаемый объект привязки передает свои обычные аргументы как ссылки lvalue на связанную функцию при вызове. Он не знает, что вы собираетесь вызвать его только один раз и хотите, чтобы указатель был перемещен.
Попробуйте
work(ptr). Весь этот механизмTestFотвлекает от сути проблемы в коде.