我处于多线程环境中,我有一个从套接字接收数据的线程,我想将该数据发送到消息队列。
例如,像这样:
char buf[N];
size_t len = ::recv(buf, ...);
queue.send([buf,len] {
//stuff
});
但由于buf
可能超出范围,或被下一个::recv()
覆盖,因此无效。现在我 COULD 将其复制到string
/ std::vector
/之后,然后通过值传递 THAT :
char buf[N];
size_t len = ::recv(buf, ...);
std::string my_data(buf, len);
queue.send([my_data](){ /* stuff */ });
但是我要发一份额外的副本吧?有没有办法在没有额外开销的情况下获得相同的功能?
答案 0 :(得分:18)
是的,你可以。标准说(5.1.2p21):
当评估lambda表达式时,复制捕获的实体用于直接初始化生成的闭包对象的每个对应的非静态数据成员。 (对于数组成员,数组元素按增加的下标顺序进行直接初始化。)
表明lambda可以通过复制捕获数组。