5.2.22 · HinglishC++ Programming

Lambda expressions — capture list (by value, by reference)

1,912 words9 min readRead in English

5.2.22 · Coding › C++ Programming


Lambda + capture list KYA hai?


YEH EXIST KYUN KARTA HAI? (first principles)

Ek lambda

int n = 10;
auto f = [n](int x){ return x + n; };

roughly aise compile hota hai:

struct __Lambda {
    int n;                       // captured BY VALUE -> member ki tarah store hua (ek COPY)
    int operator()(int x) const  // const! isliye by-value default mein read-only hota hai
    { return x + n; }
};
__Lambda f{ n };                 // n creation time par struct mein copy ho gaya

Ab by reference se compare karo:

auto g = [&n](int x){ return x + n; };
// struct { int& n; int operator()(int x) const { return x + n; } };

Member ek reference int& hai — original n ka alias. Toh g hamesha n ki current value dekhta hai.

Figure — Lambda expressions — capture list (by value, by reference)

KAISE use karte hain — worked examples


Dangling-reference ka trap



Recall Feynman: ek 12-saal ke bacche ko explain karo

Soch lo tum ek lunchbox (lambda) pack kar rahe ho baad mein use karne ke liye. Tum ya toh asli sandwich andar rakh sakte ho (by value) — woh tumhara hai, fully portable, lekin woh sandwich waisi hai jaise pack karte waqt thi. Ya tum ek note chipka sakte ho jisme likha ho "Mom se kitchen mein sandwich maango" (by reference) — tumhe hamesha taaza milega, lekin agar Mom vacation par chali gayi (variable ka scope khatam hua), toh tumhara note ek khaali kitchen ko point karta hai aur tumhe kuch nahi milta (crash). Toh: saath le jaana hai → asli cheez rakh do (value). Kitchen ke paas raho aur taaza chahiye → note rakh lo (reference).


Active recall

Lambda ki capture list [...] kya specify karti hai?
Enclosing-scope ke kaun se local variables lambda use kar sakta hai, aur kaise (by value=copy, ya by reference=alias).
By value [x] vs by reference [&x]: original mein baad ke changes kaun dekhta hai?
By reference [&x] current (live) value dekhta hai; by value [x] creation time ka frozen snapshot rakhta hai.
Lambda compile hokar kya banta hai?
Ek anonymous class (closure type) jisme operator() hoti hai; captures uski member variables ban jaate hain.
Default mein lambda ke andar by-value captured variable ko modify kyun nahi kar sakte?
Kyunki operator() default mein const hoti hai; captured copy ek const member hai. Copy ko edit karne ke liye mutable use karo.
Kya by-value capture ko mutable se edit karna original variable ko change karta hai?
Nahi — sirf lambda ki internal copy change hoti hai; original untouched rehta hai.
[=] kya capture karta hai?
Jo kuch body actually use karti hai, by value (copies).
[&] kya capture karta hai?
Jo kuch body actually use karti hai, by reference (aliases).
[=, &y] ka matlab kya hai?
Default capture by value, lekin y specifically by reference.
By reference capture karne ka main khatre kya hai?
Dangling reference / UB agar lambda captured variable ke scope se zyada jiye (e.g., return ho, store ho, async use ho).
Jab lambda apna scope escape kare, kaunsa capture prefer karna chahiye?
By value, taaki data lambda ki apni storage mein jiye.
[this] kya capture karta hai?
Enclosing object ka this pointer, jisse lambda uske members access kar sake.

Connections

  • Function objects (functors) — ek lambda hai ek compiler-generated functor.
  • std::function — type-erased wrapper jo kisi bhi lambda ko hold kar sakta hai.
  • References vs pointers in C++[&x] ke peeche int& member ko explain karta hai.
  • Object lifetime and scope — dangling-reference trap ki jad.
  • const member functions — kyun by-value captures default mein read-only hain.
  • std::thread and async — classic jagah jahan by-reference capture galat ho jaata hai.

Concept Map

is compiled to

contains

becomes

by value v

by reference and v

member is

member is

sees

sees

operator is const

unlocked by

Lambda expression

Hidden struct with operator

Capture list bracket

Member variables of struct

Stores a copy

Stores a reference alias

int n member

int& n member

Frozen snapshot v0

Live current value v1

By value read-only by default

mutable keyword