无法在 std::function<> 中传递 std::unique_ptr
Cannot pass std::unique_ptr in std::function<>
#include <functional>
#include <memory>
#include <string>
#include <iostream>
void foo(std::function<void()> f)
{
f();
}
int main()
{
std::unique_ptr<int> handle = std::make_unique<int>(5);
foo(
[h = std::move(handle)]() mutable
{
std::cout << *h << std::endl;
});
}
以下代码编译错误
C:\Program Files (x86)\Microsoft Visual Studio19\Professional\VC\Tools\MSVC.28.29910\include\functional(914,58): error C2280: 'main::<lambda_1aa523ba59bbecea5306bc1fd178120f>::<lambda_1aa523ba59bbecea5306bc1fd178120f>(const main::<lambda_1aa523ba59bbecea5306bc1fd178120f> &)': attempting to reference a deleted function
- 为什么会这样?
- 有没有办法在 std::function
中传递 std::unique_ptr 而不是通过引用传递它?
std::function
要求函数对象是可复制构造的,因此您不能指望将 lamdba 移动到它。在初始化时,它会尝试复制 lambda 以及 std::unique_ptr
,它是此 lambda 的成员,但预计会失败。您可以做的是将您的 lambda 存储在一个变量中,并将其传递给使用 std::ref
接受 const std::function&
的函数,如下所示:
void foo(const std::function<void()>& f); // function declaration
auto a = [h = std::move(handle)]() mutable
{
std::cout << *h << std::endl;
};
foo(std::ref(a));
这是一个具有更详细答案的相关问题:How to create an std::function from a move-capturing lambda expression?
#include <functional>
#include <memory>
#include <string>
#include <iostream>
void foo(std::function<void()> f)
{
f();
}
int main()
{
std::unique_ptr<int> handle = std::make_unique<int>(5);
foo(
[h = std::move(handle)]() mutable
{
std::cout << *h << std::endl;
});
}
以下代码编译错误
C:\Program Files (x86)\Microsoft Visual Studio19\Professional\VC\Tools\MSVC.28.29910\include\functional(914,58): error C2280: 'main::<lambda_1aa523ba59bbecea5306bc1fd178120f>::<lambda_1aa523ba59bbecea5306bc1fd178120f>(const main::<lambda_1aa523ba59bbecea5306bc1fd178120f> &)': attempting to reference a deleted function
- 为什么会这样?
- 有没有办法在 std::function
中传递 std::unique_ptr 而不是通过引用传递它?
std::function
要求函数对象是可复制构造的,因此您不能指望将 lamdba 移动到它。在初始化时,它会尝试复制 lambda 以及 std::unique_ptr
,它是此 lambda 的成员,但预计会失败。您可以做的是将您的 lambda 存储在一个变量中,并将其传递给使用 std::ref
接受 const std::function&
的函数,如下所示:
void foo(const std::function<void()>& f); // function declaration
auto a = [h = std::move(handle)]() mutable
{
std::cout << *h << std::endl;
};
foo(std::ref(a));
这是一个具有更详细答案的相关问题:How to create an std::function from a move-capturing lambda expression?