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

标签 c++ function lambda c++14 move

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

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

相关文章:

c - 如何在不使用任何内置函数的情况下将整数转换为 C 字符串,反之亦然以及其他数据类型?

java - 这里的 Optional<Class> 有什么问题?

c++ - mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file . .. 访问被拒绝

c++ - 在 C++ 中的函数名前使用 '&' 运算符

c++ - GetClickablePoint 不适用于 UI 自动化

c - 用C函数获取字符串

amazon-web-services - 如何在 aws kinesis 数据分析的 cloudformation 中将目标设置为 lambda

node.js - 使用 AWS Lambda 获取 url feed 的代理

c++ - 从 xsd :extension 获取 C++ 对象

c++ - 在 std::ostream 输出后添加新行而不显式调用它