我处于多线程环境中,我有一个从套接字接收数据的线程,我想将该数据发送到消息队列中.
例如,像这样:
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可以通过复制捕获数组.
| 归档时间: |
|
| 查看次数: |
4358 次 |
| 最近记录: |