C++17 λ捕获*这个
C++17 lambda capture *this
C++17 将按值添加此对象的副本捕获,捕获规范为 [*this]
。
这有什么用?它与捕获this
有何不同?这不能在 C++14 年用[tmp = *this]
实现吗?
解释为什么P0018R3在他们的示例中使用 [=, tmp = *this]
而不是 [tmp = *this]
的奖励。如果他们使用[tmp = *this]
,C++14解决方案的所有缺点都将被消除。
它有什么用? 当您需要*this
的副本时,它很有用 - 例如,当评估 lambda 时*this
本身不再有效时。
它与捕获this
有何不同? 它创建对象的副本,以便在计算 lambda 时,其this
指针指向副本,而不是原始对象。
[tmp = *this]
可以在 C++14 中实现吗? 它可以,但[*this]
更方便,因为代码可以在不前缀成员访问的情况下移动 tmp.
. 否则,尤其是对于 [=, tmp = *this]
,当您打算引用副本时,可能会意外引用原始对象的成员(特别是如果您习惯于剪切+粘贴编程)。 在这种情况下,[=,*this]
是一种更安全的选择,因为原始对象无法从 lambda 的主体内部访问(至少不能通过 this
指针)。
假设*this
是一个句柄类,它维护对某些共享状态的shared_ptr
。
共享 impl 是(例如)协议处理程序状态机。
句柄类通过一系列异步处理程序传递,因此它本身必须是可复制的。每个处理程序都会改变共享状态。
一个强大的用例可能是用于自定义asio
服务(例如,http_protocol_socket
)的协议处理程序。
[=, tmp = *this]
将按值混杂地捕获任何变量,包括相当危险的this
指针本身,以及专门捕获*this
到tmp
中。
在此用例中,无意中引用异步处理程序中的this
是危险的,因为它很可能是一个悬而未决的指针。这是一个等待发生的错误。
[tmp=*this]
只会捕获*this
.
- 有人能分解一下这个c++模板的语法吗
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么在这个代码结束循环中没有得到结束
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 当类定义不可见时捕获异常
- 如何在BST的这个简单递归实现中消除警告
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 这个指针在c++中的用法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 为什么这个信号处理程序不能捕获 SIGHUP 或 SIGQUIT?
- 在这个C++代码中捕获的用法是什么
- C++17 λ捕获*这个
- 这个指针是如何被捕获的
- 为什么要在lambdas中捕获这个以及指向这个的共享指针
- C++lambda通过引用捕获这个与捕获的比较
- 使用这个正则表达式,为什么它只捕获最后一个列表项?
- 为什么这个代码捕获块不执行