我上次在2003年使用过C ++,我正在尝试重温,并学习新的东西。已经在Java工作了一段时间,并且只是学习它的Lambda语法。在C ++中看到这个例子,并想知道是否有人可以解释它:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int i = 42;
char code = 'c';
[=, &i]() mutable
{
i++;
code = 'd';
std::cout << "i: " << i << "code " << code << std::endl;
}();
void wait()
{
cin.clear();
cin.ignore();
cin.get();
}
int main()
{
std::cout << "i: " << i << "code " << code << endl;
// hold output window open
wait();
return 0;
}
这是operator = overload的新lambda语法吗?我会写一个测试函数,但不知道如何调用它。
答案 0 :(得分:0)
=
表示它将按值捕获所有变量,&i
指定必须通过引用捕获i
。
mutable
表示它可以更改输入参数值。由于没有,这根本没有效果。
答案 1 :(得分:0)
[]
是lambda的捕获列表。如果它显示[=]
,它将按副本捕获lambda中使用的所有自动变量。在您的情况下,这将意味着i
被引用捕获,而code
(lambda中使用的另一个自动变量)被副本捕获。
mutable
意味着可变地捕获变量,因此lambda可以更改捕获的变量。但是这里的lambda不会改变任何捕获的变量......
答案 2 :(得分:0)
我无法回复评论,因为我仍然没有50个代表点(我以前的答案会自动转移到评论中,因为它只是一个链接)。
我找到了一种测试lambda表达式的简单方法,但我完全不理解你的代码示例的目的,所以我在这里发布它。我希望它有所帮助,它来自Book SFML Game Development,并使用std::functions
int add(int a, int b) { return a + b };
// Assign a lambda expression to a function
std::function<int(int, int)> adder1 = [] (int a, int b) { return a + b; };
int sum = adder1(3, 5); // same as add(3, 5)
答案 3 :(得分:0)
感谢大家的帮助。在此处找到详细说明:section "How are Lambda closures implemented"