19

当前的 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 标准中,尽管它很重要。

4

1 回答 1

5

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

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

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

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

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

于 2012-11-25T10:48:41.937 回答