首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++17 lambda捕获*这个

C++17 lambda捕获*这个
EN

Stack Overflow用户
提问于 2017-01-13 14:59:25
回答 2查看 5.1K关注 0票数 32

C++17将按值添加复制捕获[*this]

这有什么用?它与捕获this有什么不同?难道不能在C++14和[tmp = *this]中实现这一点吗?

在他们的例子中解释了为什么P0018R3使用[=, tmp = *this]而不是[tmp = *this],这是额外的好处。如果他们使用了[tmp = *this],那么C++14解决方案中列出的所有缺点都将被消除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-13 15:29:46

它有什么用?当您需要*this的副本时,它很有用--例如,当*this本身在计算lambda时不再有效时。

它与捕获this有什么不同?它创建对象的副本,以便在计算lambda时,它的this指针引用副本,而不是原始对象。

它能在C++14和[tmp = *this]中实现吗?可以,但是[*this]更方便,因为代码可以被移动,而无需用tmp.作为成员访问的前缀。否则,特别是在使用[=, tmp = *this]时,当您打算引用副本时,可能会意外地引用原始对象的成员(特别是如果您有cut+paste编程的习惯)。在这种情况下,[=,*this]是一种更安全的选择,因为从lambda的体内无法访问原始对象(至少不能通过this指针访问)。

票数 34
EN

Stack Overflow用户

发布于 2017-01-13 15:10:43

假设*this是一个句柄类,它将shared_ptr维护到某种共享状态。

共享进程是(例如)协议处理程序状态机。

handle类通过一系列异步处理程序传递,因此它本身必须是可复制的。每个处理程序都会改变共享状态。

这方面的强用例可能是用于自定义asio服务(例如,http_protocol_socket)的协议处理程序。

[=, tmp = *this]将杂乱无章地按值捕获任何变量,包括非常危险的this指针本身,以及专门将*this捕获到tmp中。

在这个用例中,在异步处理程序中无意中引用this是危险的,因为它可能是一个悬空指针。这是一个等待发生的错误。

[tmp=*this]只会捕获*this

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41637451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档