في C 11، يتم التقاط المتغيرات في lambdas بشكل عام عن طريق المرجع. يظل هذا المرجع حيًا طالما أن لامدا موجودة، مما قد يؤدي أحيانًا إلى سلوك غير مقصود إذا تم نقل المتغير الملتقط للخارج.
في C 14، معمم تم تقديم التقاط لامدا، مما يسمح بالتقاط الحركة. يتيح ذلك معالجة ملائمة لأنواع النقل فقط، مثل المؤشرات الفريدة.
std::make_unique() .then([u = std::move(u)] { do_something_with(u); });
قبل C 14، يمكن محاكاة التقاط الحركة باستخدام وظائف المساعدة:
ينشئ هذا الأسلوب فئة مجمعة، rref_impl، الذي يغلف القيمة ويدير عمرها.
templateusing rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
ومع ذلك، فإن التقاط rref في ملف lambda يسمح بنسخه، مما قد يؤدي إلى حدوث أخطاء في وقت التشغيل.
تستخدم هذه الطريقة دالة تأخذ القيمة الملتقطة حسب المرجع وترجع لامدا التي تستدعي الدالة ذات القيمة الملتقطة كوسيطة.
templateusing capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward (v); });
هذا يمنع نسخ lambda و يضمن نقل القيمة الملتقطة إلى نطاق لامدا.
تذكر أن هذه الحلول ليست أنيقة مثل التقاط لامدا المعمم في C 14، ولكنها توفر طريقة محاكاة التقاط الحركة في الإصدارات السابقة من اللغة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3