为什么我不能移动包含移动未来的可变函数?
Why can't I move a mutable function that contains a moved future?
我基本上是在尝试这样做:
using Type = SomeTypeThatIWantToMove;
std::promise<Type> promised_result;
std::future<Type> promised_future = promised_result.get_future();
using Callback = std::function<void()>;
Callback function_which_should_be_movable =
[this, future_result(std::move(promised_future))]() mutable
{
this->some_function(future_result.get()); // signature: void some_function(const Type&)
};
using ResultBuilder = std::function<Type(Callback&&)>;
// result_builder is of type ResultBuilder
Type thingy = result_builder(std::move(function_which_should_be_movable));
MinGW 告诉我,function_which_should_be_movable 的 Move-Constructor 被删除了,因为 std::future 的 Copy-constructor 被删除了。但是,我不明白为什么编译器会尝试复制 future 而不是移动它。
function_which_should_be_movable
是 std::function
类型。根据 cppreference:
template< class F > function( F f );
F
must meet the requirements
of Callable
and CopyConstructible
.
您尝试用来构造 std::function
对象的 lambda 表达式不可复制,因此出现了问题。
为什么std::function
有这个要求,请看这个问题:Why the initializer of std::function has to be CopyConstructible?(完全是我自己问的)。简单地说,std::function
使用的类型擦除技术将实例化 F
的复制构造函数。无论您(std::function
对象的用户)是否实际使用了此复制构造函数,都会发生这种情况。
我基本上是在尝试这样做:
using Type = SomeTypeThatIWantToMove;
std::promise<Type> promised_result;
std::future<Type> promised_future = promised_result.get_future();
using Callback = std::function<void()>;
Callback function_which_should_be_movable =
[this, future_result(std::move(promised_future))]() mutable
{
this->some_function(future_result.get()); // signature: void some_function(const Type&)
};
using ResultBuilder = std::function<Type(Callback&&)>;
// result_builder is of type ResultBuilder
Type thingy = result_builder(std::move(function_which_should_be_movable));
MinGW 告诉我,function_which_should_be_movable 的 Move-Constructor 被删除了,因为 std::future 的 Copy-constructor 被删除了。但是,我不明白为什么编译器会尝试复制 future 而不是移动它。
function_which_should_be_movable
是 std::function
类型。根据 cppreference:
template< class F > function( F f );
F
must meet the requirements ofCallable
andCopyConstructible
.
您尝试用来构造 std::function
对象的 lambda 表达式不可复制,因此出现了问题。
为什么std::function
有这个要求,请看这个问题:Why the initializer of std::function has to be CopyConstructible?(完全是我自己问的)。简单地说,std::function
使用的类型擦除技术将实例化 F
的复制构造函数。无论您(std::function
对象的用户)是否实际使用了此复制构造函数,都会发生这种情况。