这是我生成错误的示例代码:
#include <functional>
using namespace std;
struct S {
S() = default;
S(const S&) = delete;
S(S&&) = default;
S& operator=(const S&) = delete;
S& operator=(S&&) = delete;
};
template <typename F>
void post(F&& func)
{
function<void()> f{forward<F>(func)};
}
int main()
{
S s;
post([s2 = move(s)] { });
}
在 main()
的 lambda 内部,我使用 std::move()
捕获局部变量 s
。在调用 post() 之前,s2
必须已成功构建 move。
但是,在 post()
内部,f
无法使用对此 lambda 类型的右值引用来构造。
如果我删除,s2 = move(s)
,f
可以使用此右值引用构造。
为什么添加 s2 = move(s)
会使 lambda 不可 move ?
这里是 link尝试一下 coliru。
最佳答案
你的 lambda 不会因为 move 捕捉而变得不可 move 。但它确实变得不可复制,这是一个问题。
std::function
不支持将提供的仿函数 move 到自身中,它总是进行复制。因此,不可复制的 lambda(和其他可调用函数)不能与 std::function 一起使用。造成此限制的原因是标准要求 std::function 是可复制的,如果使用不可复制的可调用函数进行初始化,则无法实现这一点。
关于c++ - 如果 lambda 使用 std::move() 捕获不可复制的对象,为什么它是不可 move 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48003258/