Я пытался найти способ сделать это, используя стандартную библиотеку c ++ 0x, но не смог.В конце концов я решил написать свой собственный удобный класс rvalue_reference_wrapper и rvalue_ref ().Как обычно с std :: bind, вам нужно обернуть свой не копируемый объект во что-то, что можно скопировать (лучший пример - reference_wrapper).Вы могли также просто передать указатель, но это означает изменение вашего интерфейса.
Это сработало на моей машине:
#include <iostream>
#include <functional>
#include <memory>
template< class T >
struct rvalue_reference_wrapper
{
rvalue_reference_wrapper( T&& t )
: t_(std::move(t))
{}
operator T&&() const volatile
{
return std::move(t_);
}
private:
T&& t_;
};
template< class T >
rvalue_reference_wrapper<T> rvalue_ref( T&& t )
{
return rvalue_reference_wrapper<T>(std::move(t));
}
void go( std::unique_ptr<int> i )
{
std::cout << *i << std::endl;
}
int main()
{
std::unique_ptr<int> i(new int(1));
auto b = std::bind( go, rvalue_ref(std::move(i)) );
//auto b = std::bind( go, std::ref(std::move(i)) ); // Wont work
b();
}
Я не сделал код пуленепробиваемым, но приветствую некоторые обсуждения онеобходимость в rvalue_reference_wrapper или как его смоделировать с использованием std :: reference_wrapper.
Кроме того, для вашего конкретного случая вам, вероятно, потребуется написать разностную версию rvalue_reference_wrapper, которая содержит объект по значению неСсылка на rvalue, поскольку ваш оригинальный unique_ptr, вероятно, покинет область видимости (и будет уничтожен), поскольку вы используете асинхронные вызовы asio.