是否有可能在C ++ 11/14语法中编写一个将看到父变量的lambda函数?

时间:2014-02-03 10:12:36

标签: c++ c++11 lambda

在抽象中:

int i = 1;
auto go = [] () {
    return i;
};

是否有可能在现代C ++语法中做出类似的东西?

3 个答案:

答案 0 :(得分:33)

从形式上讲,访问周围环境的能力是功能(不能)和闭包(可以)之间的关键区别。根据语言,环境 capture 可能通过复制或引用发生。

在C ++ 11(及更高版本)中,lambdas是闭包,和C ++一样,我们有一种细粒度的方式来指定 捕获的完成方式:

  • 副本:隐式[=]() { return i; }或明确[i]() { return i; }
  • 通过引用:隐式[&]() { return i; }或明确[&i]() { return i; }

和C ++ 14甚至引入了广义lambda捕获,因此您可以捕获:

  • by move:现有变量[i = std::move(i)]() { return i; }
  • 或创建新变量[i = 1]() { return i; }

方括号分隔捕获列表。

答案 1 :(得分:6)

当然,取决于您是否想要按值捕获它:

auto go = [i] () {
    return i;
};

或参考:

auto go = [&i] () {
    return i;
};

答案 2 :(得分:3)

只需将其放入捕获部分:

auto go = [i] () {
   return i;
};