首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获列表中捕获的行为[c++]

捕获列表中捕获的行为[c++]
EN

Stack Overflow用户
提问于 2015-10-25 20:37:30
回答 1查看 67关注 0票数 2

我对capturescapture-list中的行为感到困惑。

代码语言:javascript
复制
#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
}

输出:

代码语言:javascript
复制
122
233 

如果lambda函数在另一个函数中声明:

代码语言:javascript
复制
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();
};

据我所知,

  • 当定义了lambda函数时,将用其当前值初始化by-copy捕获。
  • 调用函数时初始化by-reference捕获。
  • by-copy捕获不会影响其块外部。
  • by-reference捕获可以更改其原始值。

我说的对吗?我已经学习过了,但我没有弄清楚。有人能解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-25 21:01:21

在这个lambda表达式中

代码语言:javascript
复制
auto m = [a, &b, &c]() mutable
{
    std::cout << a << b << c << '\n';  // prints 122
    a = 3; b = 3; c = 3;
};

创建的对象有自己的a副本。定义对象时,变量a的值为1。

对于另外两个变量,对象包含引用。

您可以用以下方式想像lambda表达式

代码语言:javascript
复制
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的任何更改都不会影响对象的相应数据成员。但是,当变量bc被更改时,对象的相应运算符函数的输出将反映这些更改。

所以在这些声明之后

A= 2;b= 2;c= 2;

这个电话

代码语言:javascript
复制
 m();

将输出由变量a的前一个值以及bc的当前值初始化的对象的自己的数据成员的值,因为它包含对这些变量的引用。

所以输出是

代码语言:javascript
复制
122

第二输出

代码语言:javascript
复制
std::cout << a << b << c << '\n';

反映变量abc的当前值,即2、3和3,因为在之前对lambda变量的调用中,bc发生了更改。所以你得到了

代码语言:javascript
复制
233
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33334831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档