我对captures在capture-list中的行为感到困惑。
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 1, c = 1;
auto m = [a, &b, &c]() mutable
{
std::cout << a << b << c << '\n'; // prints 122
a = 3; b = 3; c = 3;
};
a = 2; b = 2; c = 2;
m();
std::cout << a << b << c << '\n'; // prints 233
}输出:
122
233 如果lambda函数在另一个函数中声明:
auto m1 = [a, &b, &c]() mutable
{
auto m2 = [a, b, &c]() mutable
{
std::cout << a << b << c << '\n';
a = 4; b = 4; c = 4;
};
a = 3; b = 3; c = 3;
m2();
};据我所知,
by-copy捕获。by-reference捕获。by-copy捕获不会影响其块外部。by-reference捕获可以更改其原始值。我说的对吗?我已经学习过了,但我没有弄清楚。有人能解释一下吗?
发布于 2015-10-25 21:01:21
在这个lambda表达式中
auto m = [a, &b, &c]() mutable
{
std::cout << a << b << c << '\n'; // prints 122
a = 3; b = 3; c = 3;
};创建的对象有自己的a副本。定义对象时,变量a的值为1。
对于另外两个变量,对象包含引用。
您可以用以下方式想像lambda表达式
int a = 1, b = 1, c = 1;
class Unnamed
{
private:
int a;
int &b;
int &c;
public:
Unnamed( int a, int &b, int &c ) : a( a ), b( b ), c( c )
{
}
void operator ()()
{
std::cout << a << b << c << '\n'; // prints 122
a = 3; b = 3; c = 3;
}
} m( a, b, c ); 因此,在lambda对象定义之后对a的任何更改都不会影响对象的相应数据成员。但是,当变量b和c被更改时,对象的相应运算符函数的输出将反映这些更改。
所以在这些声明之后
A= 2;b= 2;c= 2;
这个电话
m();将输出由变量a的前一个值以及b和c的当前值初始化的对象的自己的数据成员的值,因为它包含对这些变量的引用。
所以输出是
122第二输出
std::cout << a << b << c << '\n';反映变量a、b和c的当前值,即2、3和3,因为在之前对lambda变量的调用中,b和c发生了更改。所以你得到了
233https://stackoverflow.com/questions/33334831
复制相似问题