(我已经阅读了C++中lambda派生的隐式仿函数的生命周期是什么?已经没有回答这个问题了.)
我理解C++ lambda语法只是用于创建具有调用操作符和某个状态的匿名类的实例的糖,并且我理解该状态的生存期要求(由您是否通过引用的值捕获来决定.)但是什么是lambda对象本身的生命周期?在以下示例中,std::function
返回的实例是否有用?
std::function<int(int)> meta_add(int x) {
auto add = [x](int y) { return x + y; };
return add;
}
Run Code Online (Sandbox Code Playgroud)
如果是,它是如何工作的?这对我来说似乎有点太神奇了 - 我只能通过std::function
复制整个实例来实现它的工作,根据我捕获的内容,这可能非常繁重 - 过去我std::function
主要使用裸函数指针,复制它们是快.鉴于std::function
类型擦除,它似乎也有问题.
可以说我有以下代码片段:
// global variable
std::thread worker_thread;
// Template function
template <typename Functor>
void start_work(Functor &worker_fn) // lambda passed by ref
{
worker_thread = std::thread([&](){
worker_fn();
});
}
Run Code Online (Sandbox Code Playgroud)
这被称为:
void do_work(int value)
{
printf("Hello from worker\r\n");
}
int main()
{
// This lambda is a temporary variable...
start_work([do_work](int value){ do_work(value) });
}
Run Code Online (Sandbox Code Playgroud)
我开始在MSVC2012上开发.这一切都很好,似乎工作.但是当我在Linux平台上移动到gcc编译器时,我得到以下(缩写)错误:
no known conversion for argument 1 '...__lambda3' to '...__lambda3&'
我的问题: