为什么要在lambdas中捕获这个以及指向这个的共享指针
Why capture this as well as shared-pointer-to-this in lambdas?
在Boost.asio C++11示例中,有如下片段:
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, max_length),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}
我理解为什么需要self
指针来保持类的活动(请参阅此问题),但我不理解为什么this
指针也被捕获。这只是为了让作者写do_write(length)
而不是self->do_write(length)
,还是另有原因?
如果未捕获this
,则无法从lambda内部调用类的方法(例如do_write
)。或访问成员变量。当然,您可以改为编写self->do_write()
,但它既不那么优雅,也可能更慢(因为涉及到shared_ptr
)。
那里给出的答案是绝对错误!你不应该两个都通过!以下是您应该如何在不通过this
:的情况下,根据您的代码进行操作
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, max_length),
[self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
self->do_write(length);
}
});
}
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址