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

sum*_*ght 19 c++ lambda move-semantics c++11

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

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

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

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

Pot*_*ter 5

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

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

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

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

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