التقاطات Lambda بالقيمة وبالمرجع وmutable
اختر عبارات الالتقاط بعناية، وافهم حالة Lambda.
التقاطات Lambda بالقيمة وبالمرجع وmutable درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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) الالتقاط بالنقل.
الأسئلة الشائعة
هل درس «التقاطات Lambda بالقيمة وبالمرجع وmutable» مجاني؟
نعم — نص درس «التقاطات Lambda بالقيمة وبالمرجع وmutable» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «التقاطات Lambda بالقيمة وبالمرجع وmutable»؟
اختر عبارات الالتقاط بعناية، وافهم حالة Lambda. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «التقاطات Lambda بالقيمة وبالمرجع وmutable»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كائنات الدوال والدوال الكائنية
- التقاطات Lambda بالقيمة وبالمرجع وmutable
- Lambdas العامة وعمليات الإغلاق في C++14
- std::function والكائنات القابلة للاستدعاء بعد محو النوع