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;}
- 按移动:现有变量
[i=std::move(i)](){return i;}
- 或者创建一个新变量
[i=1](){return i;}
方括号界定了捕获列表。从技术上讲,
std::move
版本也会创建一个新变量(如果你想学究的话,任何捕获都一样)。另外,我不会将其作为这两种形式的特例-广义lambda捕获可以用任何东西初始化。@Xeo:std::move中有趣的部分是对标识符重复使用相同的“名称”,即使从概念上讲std::move(I)中的I
来自外部,i
fromi=
来自内部。我会尝试用不同的词来表达。