Я вижу, что вы используете std :: move. Почему бы вам не использовать std :: bind, который должен знать семантику перемещения?
template<class F, class... BoundArgs>
unspecified bind(F&&, BoundArgs&&...);
template<class R, class F, class... BoundArgs>
unspecified bind(F&&, BoundArgs&&...);
Как объявить ходовую версию fullfil_1
void fullfil_1(boost::promise<int>&é prom, int x)
{
prom.set_value(x);
}
Boost.Bind пока не поддерживает семантику перемещения (по крайней мере, я не в курсе). Я надеюсь, что рассмотренный в настоящий момент Boost.Move будет принят и что Boost.Bind, Boost.Lambda и Boost.Phoenix добавят интерфейсы семантики перемещения.
Вы можете попробовать составить ссылку и двигаться следующим образом
boost::function<void()> f_set_one = boost::bind(&fullfil_1, boost::ref(std::move(pi)), 1);