การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์
- การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable
- แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14
- std::function และออบเจ็กต์เรียกใช้ที่ลบชนิด