C++17将按值添加复制捕获和[*this]。
这有什么用?它与捕获this有什么不同?难道不能在C++14和[tmp = *this]中实现这一点吗?
在他们的例子中解释了为什么P0018R3使用[=, tmp = *this]而不是[tmp = *this],这是额外的好处。如果他们使用了[tmp = *this],那么C++14解决方案中列出的所有缺点都将被消除。
发布于 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指针访问)。
发布于 2017-01-13 15:10:43
假设*this是一个句柄类,它将shared_ptr维护到某种共享状态。
共享进程是(例如)协议处理程序状态机。
handle类通过一系列异步处理程序传递,因此它本身必须是可复制的。每个处理程序都会改变共享状态。
这方面的强用例可能是用于自定义asio服务(例如,http_protocol_socket)的协议处理程序。
[=, tmp = *this]将杂乱无章地按值捕获任何变量,包括非常危险的this指针本身,以及专门将*this捕获到tmp中。
在这个用例中,在异步处理程序中无意中引用this是危险的,因为它可能是一个悬空指针。这是一个等待发生的错误。
[tmp=*this]只会捕获*this。
https://stackoverflow.com/questions/41637451
复制相似问题