首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda捕获C++14

Lambda捕获C++14
EN

Stack Overflow用户
提问于 2014-08-20 15:04:50
回答 2查看 9K关注 0票数 10

我遇到过这样的符号:

代码语言:javascript
复制
int x = 4;
auto y = [&r = x, x = x+1]()->int { 
    r += 2;
    return x+2;
}();

你能解释一下这句话吗?我是C++03的用户,最近升级到了C++11。从今天开始,我启动了C++14并遇到了这个片段。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-20 15:12:37

谢谢@克里斯的维基百科参考。我发现-

这是一个很好的解释,谁不知道老兰巴捕获的C++11

在C++14中:

C++11 lambda函数通过值复制或引用捕获在其外部作用域中声明的变量。这意味着lambda的值成员不能是只移动的类型。C++14允许使用任意表达式初始化捕获的成员。这允许通过值移动捕获和声明lambda的任意成员,而不需要在外部范围中相应地命名变量。 这是通过使用初始化器表达式来完成的: =值=1{返回值;}; lambda函数lambda将返回1,这是value初始化的结果。声明的捕获像通过auto从初始化器表达式中扣除类型。 这可以通过使用标准的std::move函数通过移动来捕获: std::unique_ptr ptr(新int(10));auto = value = std::move(ptr) {返回*值;};

因此,上面的表达式将x更新为6,并将y初始化为7。

票数 8
EN

Stack Overflow用户

发布于 2020-11-02 01:32:09

这个例子是C++14特性"Lambda捕获初始化器“的一部分,它允许创建用任意表达式初始化的lambda捕获。使用此引用-捕获可以有不同的名称与引用的变量。

如果您运行您的代码:

代码语言:javascript
复制
int x = 4;
auto y = [&r = x, x = x+1]()->int { 
    r += 2; //r=6
    return x+2;//5+2
};
cout<<y()<<endl; // this will print 7
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25408190

复制
相关文章

相似问题

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