【发布时间】:2021-06-29 09:51:36
【问题描述】:
#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 Studio\2019\Professional\VC\Tools\MSVC\14.28.29910\include\functional(914,58): error C2280: 'main::
: : (const main:: &)': 试图引用已删除的函数
- 为什么会这样?
- 有没有办法在 std::function
中传递 std::unique_ptr 而不通过引用传递它?
【问题讨论】:
-
你不能复制一个
unique_ptr它的复制构造函数被删除了。 -
std::function复制。 -
如果
std::function<void()>是必须的,那么您可能需要传递指针[h = handle.get()]() -
@Jarod42,当 std::function 复制了 unique_ptr?如果替换 void foo(std::function
&& f) 问题也会重现 -
@PeterDevenyi,这是最小的可重现示例,在实际情况下,我应该将 unique_ptr 的生命周期传递给 lambda
标签: c++ function lambda unique-ptr