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

base
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;
}
  1. 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
  1. 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
  1. 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