gpt4 book ai didi

c++ - 为什么 C++ lambda 不支持 move 捕获?

转载 作者:IT老高 更新时间:2023-10-28 21:58:34 26 4
gpt4 key购买 nike

当前的 C++11 标准不支持在 lambda 表达式中 move 捕获变量,例如

unique_ptr<int[]> msg(new int[1000000]);
async_op([&&msg] { // compile error : move capture is not supported
/* do something */
});

由于消息传递和唯一所有权在某些异步系统设计中具有一些关键作用,我认为 move 语义应该被视为一流的语言语义。但是 lambda 不支持 move 捕获。

当然我知道使用 move 捕获代理有一些解决方法 - 但我想知道原因决定此功能不包含在 C++11 标准中,尽管它很重要.

最佳答案

C++ 规范试图相当保守。下一个语言规范破坏符合上一个规范的程序真的很糟糕。

move 语义需要一段时间才能成熟。如果我记得的话,直到 2009 年才有变化。同时,直到类似的时间框架,许多编译器才实现 lambda。来不及填补空白,2011年还是发布标准,已经很晚了。 (使用编译器对规范进行原型(prototype)设计,测试编译器,返回并讨论规范、草稿、原型(prototype)、测试、重复。需要一段时间。)

Lambda 将在下一个标准中得到极大扩展,获得类型推导(auto 多态性)。 Xeo 提到了一种 move 初始化的潜在解决方案。

请注意,lambda 只是语法糖。它们是根据自动定义的类指定的,但不包含您不能自己做的任何事情。至于目前的语言标准,当糖用完时,您应该手动充实该实现。

顺便说一句,您可以通过捕获老式的 auto_ptr 来解决缺失的功能,这是 C++03 现在已弃用的智能指针尝试。它被自己的复制构造函数无效,本质上实现了 move 复制。但它已被 C++11 弃用,可能会导致警告。不过,您可以尝试实现类似的东西。

关于c++ - 为什么 C++ lambda 不支持 move 捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13522299/

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