你能在lambda中捕获数组吗?

Can you capture arrays in a lambda?

本文关键字:数组 lambda      更新时间:2023-10-16

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

例如,像这样:

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

但是这不起作用,因为buf可能超出范围,或者被下一个::recv()覆盖。现在我可以复制它到string/std::vector/什么,并传递的东西的值:

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

但是我在这里招致了一个额外的拷贝,对吧?有没有一种方法可以在不增加额外开销的情况下获得相同的功能?

可以。标准规定(5.1.2p21):

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

,这表明lambda可以通过复制来捕获数组。