C++ 17 lambda capture*this

bol*_*lov 27 c++ lambda c++-faq c++17

C++ 17将按值添加此对象的副本捕获,捕获规范为[*this].

这有用吗?它与捕获this有何不同?这不可能在C++ 14中实现[tmp = *this]吗?


用于解释为什么P0018R3使用[=, tmp = *this]而不是[tmp = *this]在他们的示例中的奖金.如果他们使用过[tmp = *this],那么C++ 14解决方案的所有列出的缺点都将被消除.

Tob*_*ght 29

它有用吗?当你需要副本时它很有用*this- 例如,当*thislambda被评估时它本身不再有效.

它与捕获有什么不同this?它创建了一个对象的副本,因此当评估lambda时,它的this指针引用副本,而不是原始对象.

可以用C++ 14实现[tmp = *this]吗?它可以,但[*this]更方便,因为代码可以在没有前缀成员访问权限的情况下移动tmp..否则,特别是[=, tmp = *this]当你想要引用副本时,可能会意外地引用原始对象的成员(特别是如果你习惯于剪切+粘贴编程). [=,*this]在这种情况下是一种更安全的替代方案,因为原始对象不能从lambda体内部访问(至少不能通过this指针).


Ric*_*ges 5

想象一下,这*this是一个句柄类,它维护shared_ptr一些共享状态。

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

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

一个强大的用例可能是与自定义asio服务(例如,http_protocol_socket)一起使用的协议处理程序。

[=, tmp = *this]将通过值混杂地捕获任何变量,包括相当危险的this指针本身,以及专门捕获*thistmp.

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

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