想象以下代码:如何保持shared_ptr对象的成员在异步函数中使用?
void async(connection *, std::function<void(void)>);
void work()
{
auto o = std::make_shared<O>();
async(&o->member, [] { do_something_else(); });
}
async
将,例如,开始使用的o
member
将其作为一个指针通过的螺纹。但是,当o
在async()
被调用后立即超出范围,并且它将被删除,成员也将被删除。
如何正确和很好地解决这个问题(!)?
显然one solution是通过o
到捕获列表。即使不使用,捕获也保证不被优化。
async(&o->member, [o] { do_something_else(); });
然而,最近的编译器(铛-5.0)包括-Wextra
集合中的-Wunused-lambda-capture
。这种情况下会产生未使用的lambda捕获警告。
我在lamdba里面加了(void) o;
,它使这个警告无声无息。
async(&o->member, [o] {
(void) o;
do_something_else();
});
是否有更优雅的方式来解决这个问题的范围?
(这个问题的起源是从using write_async
of boost::asio
派生)
是'member'静态函数取'的std ::功能'?这是我能想到的唯一可能性,在这种情况下,“o”甚至不需要保持活力。 –
假设为了简单起见'member'是一个'int'。 –
那么int *是一个可调用函数? –