0Pricing
C++ Academy · บทเรียน

การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable

เลือกข้อกำหนดการจับค่าอย่างรอบคอบ และทำความเข้าใจสถานะของแลมบ์ดา

การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

สรุปเรื่องการจับค่า

ส่วนกำหนดการจับค่าของแลมบ์ดาจะแสดงรายการตัวแปรจากขอบเขตโดยรอบที่แลมบ์ดาสามารถใช้ได้ รูปแบบการจับค่าจะควบคุมวิธีเข้าถึงตัวแปรแต่ละตัว

การจับค่าโดยใช้ค่า

ชื่อที่ระบุโดยไม่มี & จะถูกคัดลอกเมื่อสร้างแลมบ์ดา แลมบ์ดาจะเป็นเจ้าของสำเนาของตัวแปรนั้น

int n = 5;
auto f = [n]() { return n * 2; };
n = 10;
std::cout << f();   // 10 (captured n was 5)

การจับค่าโดยใช้การอ้างอิง

ชื่อที่มี & จะถูกจัดเก็บเป็นการอ้างอิงไปยังตัวแปรภายนอก การเปลี่ยนแปลงจะส่งต่อถึงกันทั้งสองทาง

int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc();
std::cout << counter;   // 2

การจับค่าเริ่มต้น: =

[=] จะจับค่าทุกอย่างที่ถูกใช้ในเนื้อหาของแลมบ์ดาโดยใช้ค่า สะดวกแต่บางครั้งอาจทำให้ประหลาดใจ เพราะจะจับเฉพาะตัวแปรที่มีการอ้างถึงเท่านั้น

int a = 1, b = 2, c = 3;
auto f = [=]() { return a + c; };   // captures a and c (not b)

การจับค่าเริ่มต้น: &

[&] จะจับทุกอย่างที่ถูกใช้โดยใช้การอ้างอิง โปรดระวัง การอ้างอิงไปยังตัวแปรเฉพาะที่จะแขวนลอยหากแลมบ์ดามีอายุยืนยาวกว่าขอบเขตนั้น

int n = 0;
auto bad = [&]() { return n; };
return bad;        // n dies, lambda dangles

การผสมรูปแบบการจับค่า

คุณสามารถผสมการจับค่าเริ่มต้นกับการจับค่าเฉพาะได้ ระบุตัวแปรแต่ละตัวเพื่อแทนที่รูปแบบเริ่มต้น

int a = 1, b = 2;
auto f = [=, &b]() {     // a by value, b by reference
    return a + b;
};

แลมบ์ดาที่แก้ไขค่าได้

ตัวแปรที่จับค่าโดยใช้ค่าจะเป็น const ภายในแลมบ์ดา เพิ่ม mutable เพื่อให้แลมบ์ดาแก้ไขสำเนาที่จับไว้ได้

int n = 5;
auto inc = [n]() mutable {
    ++n;
    return n;
};
inc(); inc();
std::cout << n;   // 5 (outer unchanged)

การจับค่าเริ่มต้นด้วยชื่อ (C++14)

จับผลลัพธ์ของนิพจน์โดยตั้งชื่อใหม่ให้ ผลลัพธ์นี้ช่วยให้จับค่าโดยการย้ายและกำหนดค่าเริ่มต้นที่คำนวณแล้วได้

auto ptr = std::make_unique<int>(42);
auto f = [p = std::move(ptr)]() {
    return *p;
};
// ptr is now empty; p owns the int inside the lambda

การจับค่า this

ภายในฟังก์ชันสมาชิก [this] จะจับตัวชี้ this ทำให้เข้าถึงสมาชิกทั้งหมดภายในแลมบ์ดาได้

การจับค่า *this (C++17)

[*this] จะคัดลอกออบเจ็กต์ทั้งหมดเข้าไปในแลมบ์ดา เหมาะสำหรับกรณีที่แลมบ์ดามีอายุยืนยาวกว่าออบเจ็กต์ต้นฉบับ

ข้อควรระวัง: การจับค่าโดยการอ้างอิงและการทำงานแบบอะซิงโครนัส

อย่าจับตัวแปรเฉพาะที่โดยการอ้างอิงเข้าไปในแลมบ์ดาที่ทำงานแบบอะซิงโครนัส ตัวแปรเฉพาะที่มักจะหมดอายุก่อนที่แลมบ์ดาจะเริ่มทำงาน

// BUG
int local = 42;
std::async([&local]() { use(local); });   // local dies, lambda dangles

ตรวจสอบความเข้าใจ

ควรใช้รูปแบบการจับค่าใดเพื่อให้แลมบ์ดาถือครอง std::unique_ptr จากขอบเขตภายนอก

สรุป

การจับค่าโดยใช้ค่าจะคัดลอก ส่วนการจับค่าโดยใช้การอ้างอิงจะสร้างนามแฝง ใช้ค่าเริ่มต้น [=] หรือ [&] อย่างระมัดระวัง mutable อนุญาตให้แก้ไขสำเนาที่จับโดยใช้ค่าได้ การจับค่าเริ่มต้นด้วยชื่อ (C++14) ช่วยให้จับค่าโดยการย้ายได้

คำถามที่พบบ่อย

บทเรียน “การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable”

เลือกข้อกำหนดการจับค่าอย่างรอบคอบ และทำความเข้าใจสถานะของแลมบ์ดา คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์
  2. การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable
  3. แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14
  4. std::function และออบเจ็กต์เรียกใช้ที่ลบชนิด
← กลับไปที่ C++ Academy