У меня есть функция, которая ставит лямбда в очередь, используя std::queue's
встроенную функцию emplace. Я создал shared_ptr
объект (задачу), который позже я бы запечатлел в лямбде.
template<typename Func, typename... Args>
auto submit(Func&& f, Args&&... args)
{
using result_type = std::result_of_t<Func(Args...)>;
using pckg_task_type = std::packaged_task<result_type()>;
auto task = std::make_shared< pckg_task_type >(
std::bind(std::forward<Func>(f), std::forward<Args>(args)...) );
...
}
Это та часть, которая создает путаницу:
Случай 1: Прекрасно работает
tasks.emplace(
[task](){
auto wptr = std::weak_ptr<pckg_task_type>(task);
if( auto p = wptr.lock() )
{
(*p)();
}
else
throw std::runtime_error("weak error");
}
);
Случай 2: Который сразу вызывает исключение
tasks.emplace(
[wc = std::weak_ptr<pckg_task_type>(task)](){
if( auto p = wc.lock() )
{
(*p)();
}
else
throw std::runtime_error("weak error");
}
);
С задачами, определенными как
std::queue< std::function<void()> > tasks;
Вызов Лямбда из случая 2 без включения ее в очередь не вызывает исключения.
Может кто-нибудь объяснить разницу между случаями выше? В чем проблема?