5.2.22 · D1 · HinglishC++ Programming

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

3,645 words17 min read↑ Read in English

5.2.22 · D1 · Coding › C++ Programming › Lambda expressions — capture list (by value, by reference)

Parent note padne se pehle tumhe lagbhag ek dozen choti-choti ideas khud se samajhni chahiye. Yeh page har ek idea ko bilkul zero se build karta hai, us order mein jisme ek doosre pe depend karti hain. Yahan koi bhi symbol use nahi hoga jab tak pehle draw na kar liya ho.


1. int aur doosre types — basic types (ek box kya hold kar sakta hai)

Common built-in types jo tumhe pehchanne chahiye:

  • int → ek poora number (default number type).
  • double → decimal point wala number (jaise 3.14).
  • char → ek single character (jaise 'A').
  • bool → ek truth value: true ya false.

2. Variable ek labelled box hai memory mein

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

Figure dekho: naam n ek sticky label hai, box memory mein ek real location hai (uska ek address hai — ek ghar ka number), aur value 10 woh hai jo abhi andar baitha hai. Yeh teen alag-alag cheezein hain, aur poora capture-list topic isi ke baare mein hai ki lambda inme se kise grab karta hai.

  • Naam se tumhara code us box ko refer karta hai.
  • Address batata hai ki box physically kahan hai.
  • Value hai abhi andar kya hai — aur yeh baad mein change ho sakta hai (n = 99; contents ko swap kar deta hai).

3. = ka matlab hai "andar daalo", "barabar hai" nahi

Yahi ek distinction parent ke Example 1 (n=1 phir n=99, lambda phir bhi 1 print karta hai) ko discuss karna possible banati hai: box ki contents overwrite ho gayi, lekin pehle li gayi copy nahi.


4. Address-of operator &n — "box ka ghar ka number lo"

int n = 10;
&n;   // ek expression: box n ka address (location)

5. Scope — box kahan exist karta hai, aur kab marta hai

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

Figure mein, box x sirf function make() ke andar hi zinda hai. Jaise hi make() return karta hai, poori shelf saaf ho jaati hai — x ka box ab exist nahi karta. Jo bhi us box ka address (&x) hold kar raha tha, woh ab empty space ki taraf point kar raha hai.


6. Copy vs alias (yahi poora topic hai)

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

Figure mein dono side by side dikhaye hain:

  • Left (copy): do alag boxes. Original ko 99 kar do; copy ab bhi 1 dikhata hai. → Yeh hai capture by value [n].
  • Right (reference &): ek box, do labels. Kisi bhi label se change karo aur dono "99 dekhenge". → Yeh hai capture by reference [&n].

7. auto — "compiler, type tum batao"

auto add = [](int a, int b){ return a + b; };  // iska type unnameable hai -> auto

8. struct aur brace-initialization — woh box jo bahut saare boxes hold karta hai

struct Point {      // blueprint: do boxes ek saath bundled
    int x;
    int y;
};
Point p{3, 4};      // ek Point banao; x ko 3 milta hai, y ko 4 (brace-initialization)

Yeh matter karta hai kyunki agli section ka functor — aur har lambda — exactly ek aisa hi struct hai, aur uski captured variables uske members hain, jo lambda object ke janam par brace-init se fill hote hain.


9. Ek function jo ek value ke andar rehta hai: the functor

struct Adder {
    int base;                                         // ek member box
    int operator()(int x) const { return x + base; }  // call syntax: a(5)
};
Adder a{10};   // brace-init: base ko abhi 10 milta hai
a(5);          // 15  -- function call jaisa lagta hai, actually a.operator()(5) hai

10. Copy KAB hoti hai — creation par, call par nahi

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

Figure mein timeline ko left se right padho:

  1. int n = 1; — box n mein 1 hai.
  2. auto f = [n]{ return n; };creation: copy yahan li jaati hai, isliye f ke andar member box 1 par set ho jaata hai aur freeze ho jaata hai.
  3. n = 99; — yeh sirf bahar ke box ko overwrite karta hai; f ke andar member copy pehle hi ban chuki thi aur untouched hai.
  4. f()call: yeh apna khud ka member box padhta hai, jisme ab bhi 1 likha hai.

11. const aur mutable — read-only lock aur uski chaabi

Isliye parent kehta hai ki by-value capture by default read-only hoti hai. Compiler lambda ka operator() default mein const generate karta hai, isliye uska member copy touch nahi kiya ja sakta.

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

Figure mein generated closure struct dikhaya hai: upar members (captures), neeche ek const operator(). Members par ek padlock hai const ki wajah se; word mutable woh chaabi hai jo ise hata deti hai.


12. this pointer — enclosing object ko capture karna

struct Widget {
    int value = 5;
    auto getReader() {
        return [this]{ return value; };  // [this] -> lambda value dekh sakta hai
    }
};

13. Generalized captures — init-capture aur move-capture (C++14)

int y = 7;
auto f = [x = y + 1]{ return x; };   // member x 8 se start hota hai
auto data = std::make_unique<int>(10);
auto job = [p = std::move(data)]{ return *p; };  // ownership lambda mein move hui
// data ab khaali hai; lambda ke andar p us int ka maalik hai

14. Notation ko sath mein jodna


Prerequisite map

int and basic types

variable = named box

assignment = overwrite the box

address-of and n = get the box location

reference = second name for a box

copy = new independent box

scope = when the box dies

auto = compiler picks type

lambda

struct and brace-init

functor = object you can call

const member = read only promise

mutable = the key that unlocks copies

capture by reference

capture by value at creation

dangling reference trap

this pointer

init and move capture

Left side sab "box" ideas hain; H (lambda) ko feed karne wali sab cheezein woh hain jo parent page silently assume karta hai ki tumhare paas pehle se hain.


Equipment checklist

Recall Self-test: kya main parent note ke liye ready hoon?

Type word int compiler ko kya batata hai? ::: Ki box ek whole-number box hai (ek integer) — uska size aur woh kis tarah ki value hold karta hai. Ek variable ke teen alag-alag cheezein kya hain? ::: Ek naam (label), ek address (jahan woh rehta hai), aur ek value (abhi andar kya hai). n = 99; actually kya karta hai? ::: Box n ko value 99 se overwrite karta hai (assignment, ek command — equality nahi). Expression &n kya produce karta hai? ::: Box n ka address (memory location) — by-reference capture ise use karta hai yaad rakhne ke liye ki box kahan rehta hai. Symbol & ke do kaam kya hain? ::: Naam se pehle (&n) matlab hai "address of"; type se chipka (int&) matlab hai "reference / box ka doosra naam". Reference int& kya hai? ::: Ek existing box ka doosra naam; koi naya box nahi banta, aur iske through likhna original ko change kar deta hai. Copy aur reference mein kya fark hai? ::: Copy ek brand-new independent box hai; original change karne se woh kabhi affect nahi hoti. Scope kya hai, aur closing } par kya hota hai? ::: Woh region jahan box zinda hai; } par box destroy ho jaata hai aur uska koi saved address invalid ho jaata hai. By-value capture variable ko kab copy karta hai — creation par ya call par? ::: Creation par (jab lambda object build hota hai), ek baar; woh frozen copy isliye hai ki n=1; n=99; phir bhi 1 print karta hai. Lambda ke type ke liye auto kyun likhna padta hai? ::: Uska real type compiler-generated naam hai jo tum likh nahi sakte, isliye auto compiler ko fill in karne deta hai. struct kya hai, aur a{10} kya karta hai? ::: Struct kai member boxes ko ek naam ke neeche bundle karta hai; a{10} object build karta hai aur order mein uske members fill karta hai (brace-initialization). Functor kya hai? ::: operator() wala ek object taaki ise function ki tarah call kar sako; captures uske members ban jaate hain. By-value capture default mein read-only kyun hoti hai, aur ise kya fix karta hai? ::: Generated operator() const hota hai, member changes rok ke; keyword mutable woh const cancel karta hai taaki private copy writable ho jaaye. Kya mutable bahar ki original variable ko change karta hai? ::: Nahi — yeh sirf lambda ki internal copy ko unlock karta hai; original untouched rehta hai. [this] kya capture karta hai, aur [=] object ke baare mein kya karta hai? ::: [this] current object ka address store karta hai taaki lambda uske members reach kar sake; kisi member function mein [=] bhi this capture karta hai (copy nahi) — object copy karne ke liye [*this] use karo. [x = std::move(q)] kya karta hai? ::: Ek init/move-capture: yeh ek fresh member x banata hai q ki ownership lambda mein move karke (C++14), q ko khaali chhod ke. [=, &b] decode karo. ::: Sab kuch jo use hota hai by value (copy) capture karo, except b, jo by reference capture hota hai.