你能在lambda中捕获数组吗?
Can you capture arrays in a lambda?
我处于多线程环境中的情况,其中我有一个从套接字接收数据的线程,并且我想将该数据发送到消息队列中。
例如,像这样:
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可以通过复制来捕获数组。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 捕获lambda中的std::数组
- 将数组传递到 lambda 函数中
- 使用 lambda 初始化静态数组
- Lambda 捕获数组元素失败
- 如何在 lambda 中访问数组成员
- unique_ptr<T> 用于数组专用化的 lambda 自定义删除器
- 使用for_each()AND lambda函数打印C样式数组的Template函数
- 数组初始化需要一个包含大括号的初始值设定项列表lambda
- 数组衰减为Lambda指针
- 你能在lambda中捕获数组吗?
- 静态lambda函数数组(c++)
- 使用lambda参数数组