gpt4 book ai didi

c++ - 如果 lambda 使用 std::move() 捕获不可复制的对象,为什么它是不可 move 的?

转载 作者:行者123 更新时间:2023-12-02 16:58:23 26 4
gpt4 key购买 nike

这是我生成错误的示例代码:

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com