Lambdas and Callables
Capture By Value
Capture by value gives a lambda its own copy of a variable.
value capture
When a lambda captures by value, later changes to the original variable do not change the captured copy.
Capture By Value
capture_by_value.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
int main() {
int base = 10;
auto addBase = [base](int amount) {
return base + amount;
};
base = 100;
int result = addBase(5);
std::cout << "capturedResult=" << result << std::endl;
std::cout << "currentBase=" << base << std::endl;
return 0;
}
#include <iostream>
int main() {
int base = 3;
auto addBase = [base](int amount) {
return base + amount;
};
base = 100;
int result = addBase(5);
std::cout << "capturedResult=" << result << std::endl;
std::cout << "currentBase=" << base << std::endl;
return 0;
}
#include <iostream>
int main() {
int base = 20;
auto addBase = [base](int amount) {
return base + amount;
};
base = 100;
int result = addBase(5);
std::cout << "capturedResult=" << result << std::endl;
std::cout << "currentBase=" << base << std::endl;
return 0;
}
base ← 10, addBase ← (empty), result ← 15
3int main() {4 int base→ 10 = 10; //@base=3, 2056 auto addBase→ (empty) = [base](int amount) {7 return base + amount;8 };910 base→ 100 = 100;11 int result→ 15 = addBase(empty)(5);1213 std::cout << "capturedResult=" << result15 << std::endl;14 std::cout << "currentBase=" << base100 << std::endl;15 return 0;16}outputcapturedResult=15 currentBase=100
base ← 3, addBase ← (empty), result ← 8
3int main() {4 int base→ 3 = 3;56 auto addBase→ (empty) = [base](int amount) {7 return base + amount;8 };910 base→ 100 = 100;11 int result→ 8 = addBase(empty)(5);1213 std::cout << "capturedResult=" << result8 << std::endl;14 std::cout << "currentBase=" << base100 << std::endl;15 return 0;16}outputcapturedResult=8 currentBase=100
base ← 20, addBase ← (empty), result ← 25
3int main() {4 int base→ 20 = 20;56 auto addBase→ (empty) = [base](int amount) {7 return base + amount;8 };910 base→ 100 = 100;11 int result→ 25 = addBase(empty)(5);1213 std::cout << "capturedResult=" << result25 << std::endl;14 std::cout << "currentBase=" << base100 << std::endl;15 return 0;16}outputcapturedResult=25 currentBase=100