16

我处于多线程环境中的情况,我有一个从套接字接收数据的线程,并且我想将该数据发送到消息传递队列中。

例如,像这样:

char buf[N];
size_t len = ::recv(buf, ...);
queue.send([buf,len] {
    //stuff
});

但这不起作用,因为buf可能超出范围,或者被 next 覆盖::recv()。现在我可以将它复制到/ / whatever并按值传递那个东西:stringstd::vector

char buf[N];
size_t len = ::recv(buf, ...);
std::string my_data(buf, len);
queue.send([my_data](){ /* stuff */ });

但是我会产生额外的副本,对吗?有没有办法在没有额外开销的情况下获得相同的功能?

4

1 回答 1

21

是的你可以。该标准说(5.1.2p21):

当计算 lambda 表达式时,复制捕获的实体用于直接初始化结果闭包对象的每个相应的非静态数据成员。(对于数组成员,数组元素按照下标升序直接初始化。)

这清楚地表明 lambda 可以通过复制捕获数组。

于 2013-03-15T02:30:08.967 回答