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
- 例如,当*this
lambda被评估时它本身不再有效.
它与捕获有什么不同this
?它创建了一个对象的副本,因此当评估lambda时,它的this
指针引用副本,而不是原始对象.
可以用C++ 14实现[tmp = *this]
吗?它可以,但[*this]
更方便,因为代码可以在没有前缀成员访问权限的情况下移动tmp.
.否则,特别是[=, tmp = *this]
当你想要引用副本时,可能会意外地引用原始对象的成员(特别是如果你习惯于剪切+粘贴编程). [=,*this]
在这种情况下是一种更安全的替代方案,因为原始对象不能从lambda体内部访问(至少不能通过this
指针).
想象一下,这*this
是一个句柄类,它维护shared_ptr
一些共享状态。
共享 impl 是(例如)协议处理程序状态机。
handle 类通过一系列异步处理程序传递,因此它本身必须是可复制的。每个处理程序都会改变共享状态。
一个强大的用例可能是与自定义asio
服务(例如,http_protocol_socket
)一起使用的协议处理程序。
[=, tmp = *this]
将通过值混杂地捕获任何变量,包括相当危险的this
指针本身,以及专门捕获*this
到tmp
.
在这个用例中,无意中this
在异步处理程序中引用是很危险的,因为它很可能是一个悬空指针。这是一个等待发生的错误。
[tmp=*this]
只会捕获*this
.