[](){}
تعبيرات لامدا [](){}
تعبير لامدا يعرّف دالة مجهولة الاسم مباشرة في مكان استخدامها — أداة أساسية مع خوارزميات STL وwrite-once callbacks قصيرة.
بدل تعريف دالة منفصلة باسم فقط لاستخدامها مرة واحدة كمعامل لخوارزمية مثل std::sort أو std::for_each، تعبير لامدا يكتب الدالة inline بمكان استدعائها مباشرة. قوس [] هو الـ capture list يحدد أي متغيرات من النطاق المحيط تصل للامدا: [=] بالقيمة (نسخة)، [&] بالمرجع (وصول مباشر للأصل)، أو تحديد أسماء بعينها [x, &y].
الصياغة
[capture](params) -> ReturnType { body }📄 مثال
std::vector<int> nums = {5, 2, 8, 1};
int threshold = 3;
// ترتيب تنازلي عبر لامدا
std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; });
// لامدا تلتقط threshold من النطاق المحيط بالمرجع
int count = std::count_if(nums.begin(), nums.end(),
[&threshold](int n) { return n > threshold; });أهم النقاط
| العنصر | الوظيفة |
|---|---|
| [] (فارغة) | لا تلتقط أي متغيّر من النطاق المحيط |
| [=] | تلتقط كل المتغيرات المستخدمة بالنسخ (بالقيمة) |
| [&] | تلتقط كل المتغيرات المستخدمة بالمرجع (وصول مباشر للأصل، تعديل ممكن) |
| mutable | يسمح بتعديل نسخ [=] الملتقطة داخل جسم اللامدا نفسها |
💡 نصائح عملية
- استخدم لامدا مع خوارزميات STL (sort، find_if، for_each) بدل كتابة دالة منفصلة لاستخدام واحد
- التقط بالمرجع [&] بحذر إذا كانت اللامدا ستُخزَّن وتُستدعى لاحقًا بعد خروج المتغيّر من نطاقه — يسبب مرجعًا معلَّقًا
⚠️ أخطاء شائعة
- التقاط [&] لمتغيّر محلي ثم تخزين اللامدا لاستدعائها بعد انتهاء نطاق ذلك المتغيّر — سلوك غير معرَّف
- استخدام [=] لالتقاط كائنات كبيرة بدون داعٍ فيُنسخ الكائن كاملًا مع كل استدعاء للامدا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.