我遇到过这样的符号:
int x = 4;
auto y = [&r = x, x = x+1]()->int {
r += 2;
return x+2;
}();你能解释一下这句话吗?我是C++03的用户,最近升级到了C++11。从今天开始,我启动了C++14并遇到了这个片段。
谢谢!
发布于 2014-08-20 15:12:37
谢谢@克里斯的维基百科参考。我发现-
在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。
发布于 2020-11-02 01:32:09
这个例子是C++14特性"Lambda捕获初始化器“的一部分,它允许创建用任意表达式初始化的lambda捕获。使用此引用-捕获可以有不同的名称与引用的变量。
如果您运行您的代码:
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 7https://stackoverflow.com/questions/25408190
复制相似问题