你能在lambda中捕获数组吗?

Bar*_*rry 13 c++ lambda c++11

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

例如,像这样:

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

但这不会起作用,因为buf可能超出范围,或被下一个覆盖::recv().现在我COULD将其复制到string/ std::vector/不管,并通过动议由价值的事情:

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

但是我在那里发了一份额外的副本,对吧?有没有办法在没有额外开销的情况下获得相同的功能?

Ben*_*igt 18

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

在计算lambda表达式时,复制捕获的实体用于直接初始化生成的闭包对象的每个对应的非静态数据成员.(对于数组成员,数组元素按增加的下标顺序进行直接初始化.)

这表明lambda可以通过复制捕获数组.

  • @Barry:只要实际捕获的变量是一个数组,而不仅仅是指向一个的变量,是的. (9认同)
  • 哦,很酷,整个数组buf被复制,而不仅仅是指针?那太漂亮了! (2认同)