相关疑难解决方法(0)

C++ lambda表达式的生命周期是多少?

(我已经阅读了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类型擦除,它似乎也有问题.

c++ lambda c++11

66
推荐指数
4
解决办法
2万
查看次数

c ++可以通过引用传递临时lambda(适用于msvc/windows但不适用于gcc/linux)?

可以说我有以下代码片段:

// 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&'

我的问题:

  • 因此,从错误中我假设lambda是一个临时变量因此无法通过引用传递 - 是吗?
  • 另外 - 任何想法为什么这适用于MSVC? - 它是自动修复我写的吗?

c++ lambda gcc visual-studio-2012

5
推荐指数
1
解决办法
127
查看次数

标签 统计

c++ ×2

lambda ×2

c++11 ×1

gcc ×1

visual-studio-2012 ×1