C++ 在C++;11/14编写lambda函数的语法,该函数将看到父变量?

C++ 在C++;11/14编写lambda函数的语法,该函数将看到父变量?,c++,c++11,lambda,C++,C++11,Lambda,抽象地说: int i = 1; auto go = [] () { return i; }; 在现代C++语法中是否可以做出类似的事情?< /p> ,把它放在捕获部分: auto go = [i] () { return i; }; 当然,这取决于您是否要按值捕获它: auto go = [i] () { return i; }; 或通过引用: auto go = [&i] () { return i; }; 从形式上讲,访问周围上下文的能力是函数

抽象地说:

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

在现代C++语法中是否可以做出类似的事情?< /p> ,把它放在捕获部分:

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

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

auto go = [i] () {
    return i;
};
或通过引用:

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

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

<>在C++ 11(及超出)中,lambdas是闭包,并且通常与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
版本也会创建一个新变量(如果你想学究的话,任何捕获都一样)。另外,我不会将其作为这两种形式的特例-广义lambda捕获可以用任何东西初始化。@Xeo:std::move中有趣的部分是对标识符重复使用相同的“名称”,即使从概念上讲
std::move(I)中的
I
来自外部,
i
from
i=
来自内部。我会尝试用不同的词来表达。