繁体   English   中英

为什么在C ++ lambda中不支持移动捕获?

[英]Why move capture is not supported in C++ lambda?

当前的C ++ 11标准不支持在lambda表达式中移动捕获变量

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

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

当然,我知道,有一些解决方法使用移动捕获代理-但我不知道这个功能不被包括在C ++ 11标准,尽管它的重要性决定的原因

C ++规范试图相当保守。 对于下一个语言规范来说,破坏以前规范中符合要求的程序真的很糟糕。

移动语义需要一段时间才能成熟。 如果我记得的话,到2009年有变化。 与此同时,lambdas在许多编译器中没有实现,直到相似的时间范围。 没有时间填补空白,仍然在2011年发布标准,这已经很晚了。 (使用编译器对规范进行原型设计,测试编译器,回过头来讨论规范,草稿,原型,测试,重复。需要一段时间。)

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

请注意,lambdas只是语法糖。 它们是根据自动定义的类指定的,但不包含您自己无法做的任何事情。 至于目前的语言标准,当糖耗尽时,您需要手动充实该实施。

顺便说一句,你可以通过捕获一个老式的auto_ptr解决这个缺失的功能,这是C ++ 03现在已经弃用的智能指针尝试。 它由自己的复制构造函数无效,基本上实现了复制移动。 但它被C ++ 11弃用,可能会引发警告。 不过,您可以尝试实现类似的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM