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

cnd*_*cnd 15 c++ lambda c++11

在抽象中:

int i = 1;
auto go = [] () {
    return i;
};
Run Code Online (Sandbox Code Playgroud)

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

Mat*_* M. 33

从形式上讲,访问周围上下文的能力是函数(不能)和闭包(可以)之间的关键区别.根据语言,可以通过复制或引用来捕获环境.

在C++ 11(及以后),lambda表达式是封闭和往常一样与C++,我们有指定的细粒度方式如何拍摄完成:

  • 通过复制:隐式[=]() { return i; }或显式[i]() { return i; }
  • 通过引用:隐式[&]() { return i; }或显式[&i]() { return i; }

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

  • 通过移动:现有变量 [i = std::move(i)]() { return i; }
  • 或创建一个新变量 [i = 1]() { return i; }

方括号分隔捕获列表.

  • 从技术上讲,`std :: move`版本也会创建一个新变量(就像任何捕获一样,如果你想变得迂腐).另外,我不会特别考虑这两种形式--_generalized lambda captures_可以用任何东西初始化. (6认同)

Jos*_*eld 6

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

auto go = [i] () {
    return i;
};
Run Code Online (Sandbox Code Playgroud)

或参考:

auto go = [&i] () {
    return i;
};
Run Code Online (Sandbox Code Playgroud)