【发布时间】:2012-11-11 10:02:13
【问题描述】:
当前的 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 标准中,尽管它很重要.
【问题讨论】:
-
原因很可能是他们在引入 lambdas 时根本没有想到这一点。 FWIW,委员会正在重新设计捕获部分,并考虑通过允许初始化程序捕获来概括它(又名
[m = std::move(msg)]{ ... })。 -
感谢您的回答。在捕获列表中允许初始化表达式看起来很有希望。
-
@rubenvb:每次调用 lambda 时都会复制捕获吗? :P 对于复制,我假设捕获也被复制。如果它是只能移动的,那么 lambda 将不可复制。
-
@rubenvb:我看不出哪里有隐藏动作。如果移动 lambda,则移动捕获。如果您复制 lambda,您(尝试)复制捕获。我看不出这有多令人困惑,但也许这就是我。
标签: c++ c++11 lambda move-semantics