我正在学习c ++ 11新函数lambda函数,我有点困惑。 我读了那个
[] Capture nothing (or, a scorched earth strategy?)
[&] Capture any referenced variable by reference
[=] Capture any referenced variable by making a copy
[=, &foo] Capture any referenced variable by making a copy, but capture variable foo by reference
[bar] Capture bar by making a copy; don't copy anything else
[this] Capture the this pointer of the enclosing class
我的问题是捕获变量意味着什么,以及返回值的区别是什么,如果要捕获变量,则必须将其返回?
例如:
[] () { int a = 2; return a; }
为什么不是
int [] () { int a = 2; return a; }
答案 0 :(得分:4)
您可以“捕获”属于封闭函数的变量。
void f() {
int a=1;
// This lambda is constructed with a copy of a, at value 1.
auto l1 = [a] { return a; };
// This lambda contains a reference to a, so its a is the same as f's.
auto l2 = [&a] { return a; };
a = 2;
std::cout << l1() << "\n"; // prints 1
std::cout << l2() << "\n"; // prints 2
}
如果需要,您可以返回捕获的变量,也可以返回其他内容。返回值与捕获无关。
答案 1 :(得分:2)
捕获列表用于将符号 带入 lambda。 返回值是指从 lambda中返回值 。
此外,lambdas使用尾随返回类型语法,如[] () -> int { int a=2; return a; }
。虽然通常最好留下明确推断的
答案 2 :(得分:1)
lambda函数的一个关键特性是它可以从声明它的范围中记住事物:
#include <iostream>
#include <vector>
#include <functional>
auto f(int i, int j) {
int k = i * j;
return [=](){ std::cout << k << "\n"; };
}
int main() {
std::vector<std::function<void(void)>> v;
v.push_back(f(2,2));
v.push_back(f(6, 7));
for (auto& l: v) {
l();
}
}
注意我们在调用lambda时不必将任何内容传递给lambda?
Lambdas本质上是围绕函子对象的语法糖,捕获是将成员变量添加到仿函数的过程:
[](char* p){ *p = toupper(*p); }
struct Lambda1 {
int operator(char* p) const { *p = toupper(*p); }
};
int x = 42;
int y = 5;
[x, &y](int i){ return i * (x + y); }
struct Lambda2 {
int x_;
int& y_;
Lambda2(int x, int& y) : x_(x), y_(y) {}
int operator(int i) { return i*(x_ + y_); }
};
从lambda返回值是可选的,但返回值是lambda的输出,而不是输入。