当前的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标准中,尽管其重要性
答案 0 :(得分:5)
C ++规范试图相当保守。对于下一个语言规范来说,破坏以前规范中符合的程序是非常糟糕的。
移动语义需要一段时间才能成熟。如果我记得的话,到2009年有变化。与此同时,lambdas在许多编译器中没有实现,直到相似的时间范围。没有时间填补空白,仍然在2011年发布标准,这已经很晚了。 (用编译器对规范进行原型设计,测试编译器,回过头来讨论规范,草稿,原型,测试,重复。需要一段时间。)
Lambda将在下一个标准中得到极大的扩展,获得类型推导(auto
多态性)。 Xeo提到了一种可能的移动初始化解决方案。
请注意,lambdas只是语法糖。它们是根据自动定义的类指定的,但不包含您自己无法做的任何事情。至于目前的语言标准,当糖耗尽时,你需要手动充实这个实现。
顺便说一下,你可以通过捕获一个老式的auto_ptr
来解决这个缺失的功能,这是C ++ 03现在不推荐使用智能指针的尝试。它由自己的复制构造函数无效,基本上实现了复制移动。但它被C ++ 11弃用,可能会引发警告。不过,你可以尝试实现类似的东西。