تخطَّ إلى المحتوى

[](){}

تعبيرات لامدا [](){}

تعبير لامدا يعرّف دالة مجهولة الاسم مباشرة في مكان استخدامها — أداة أساسية مع خوارزميات 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 الكامل بالعربي.