【发布时间】:2017-04-06 06:07:35
【问题描述】:
想象一下下面的代码:
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(); } );
但是,最近的编译器 (clang-5.0) 将 -Wunused-lambda-capture 包含在 -Wextra 集合中。这种情况会产生未使用的lambda捕获警告。
我在 lamdba 中添加了 (void) o; 以消除此警告。
async(&o->member, [o] {
(void) o;
do_something_else();
});
有没有更优雅的方法来解决这个范围问题?
(这个问题的根源来源于using write_async of boost::asio)
【问题讨论】:
-
member是采用std::function<void ()>的静态函数吗?这是我能想到的唯一可能性,在这种情况下o甚至不需要活着。 -
为了简单起见,假设
member是int。 -
那么
int*是如何成为可调用函数的呢? -
async是使用 int* 作为参数调用的函数。我将扩展我的代码示例。 -
哦,所以
async不是std::async?
标签: c++ c++11 asynchronous lambda