接下来是这个问题:可以通过引用传递临时的lambda吗?
我有一个固定的代码段:
// global variable
std::thread worker_thread;
// Template function
template <typename Functor>
void start_work(const Functor &worker_fn) // lambda passed by const ref
{
worker_thread = std::thread([&](){
worker_fn();
});
}
这样称呼:
void do_work(int value)
{
printf("Hello from worker\r\n");
}
int main()
{
// This lambda is a temporary variable...
start_work([](int value){ do_work(value) });
}
这似乎可行,但是我担心传递一个临时的lambda到线程构造函数中,因为线程将运行,但是函数start_work()将返回,而temp-lambda将超出范围。
但是我正在看定义的std :: thread构造函数:
thread()noexcept; (1)(自C ++ 11起)
线程(thread && other)没有例外;(2)(自C ++ 11起)
template <class Function,class ... Args>显式线程(Function && f,Args && ... args); (3)(自C ++ 11起)
thread(const thread&)=删除; (4)(自C ++ 11起)
所以我假设构造函数3被称为:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
我很难理解这里写的内容,但看起来它会尝试移动lambda &&
,我认为这对于临时变量是可以的。
那么我在代码片段中所做的操作是危险的(即,引用超出范围)还是正确的(即,温度已移动并且一切都很好)?还是没有?
一种替代方法是只传递我的值(进行复制),这种情况在这种情况下还算不错。
确实确实移动了一个临时对象,但它是“内部”对象,是的论点std::thread
。
该临时文件包含对“外部”临时文件的引用,的参数start_work
,并且其生存期在start_work
返回之后结束。
因此,您的“内部” lambda对象持有对在执行过程中可能存在或不存在的对象的引用,这是非常不安全的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句