想象一下这样的代码,它创建lambda函数并将其传递给其他要执行的线程(方法 schedule_task_in_thread 期望 Functor 作为唯一参数)。对象 o 到底发生了什么?是否在执行方法之前创建了临时副本? wait()可确保呼叫阻止。
#define INVOKE_IN_MYTHREAD(method_name, ...) \
return schedule_task_in_thread( [&](){ return mythread->method_name(__VA_ARGS__); }).wait().
void do_something( MyObject o ){
INVOKE_IN_MYTHREAD( method, o );
}
问题是, mythread->方法()报告的对象o与 do_something()中的对象略有不同。我试图抓住所有{copy | default | move} {constructor | assignments},但我没有看到它们被调用。
class MyObject{
uint32_t a;
std::string b;
CryptoPP::Integer c;
}
字段 a 和 b 正确传递,字段 c 设置为整数(0)。 有什么想法吗?
答案 0 :(得分:0)
您的lambda是捕获该方法的所有参数的引用,并且这些引用仅在调用线程位于do_something的主体中时才有效。
如果您按值获取lambda捕获,则会有一个副本。
比你的宏更安全
template <typename Method, typename ... Args>
void invoke_in_mythread(Method method, Args ... args)
{
schedule_task_in_thread( [=](){ return mythread->method(std::forward<Args...>(args)); }).wait();
}