التقاط المراجع في c 11 lambdas
في C ، يمكن تعبيرات Lambda التقاط المتغيرات من نطاقها المرفق. ومع ذلك ، تحدد طريقة التقاط ما إذا كان يتم الوصول إلى المتغير بالرجوع أو بالقيمة. ضع في اعتبارك الكود التالي:
#include
#include
std::function make_function(int& x) {
return [&]{ std::cout يلتقط هذا الكود المتغير x بالرجوع باستخدام بناء جملة [&]. يطرح السؤال ما إذا كان هذا البرنامج يضمن الإخراج 5 دون التذرع بالسلوك غير المحدد.
الإجابة: نعم قبل فحص الصياغة القياسية الأساسية ، من المهم ملاحظة أن هذا الرمز يعمل على النحو المقصود من قبل لجنة C. ومع ذلك ، فإن الصياغة الأولية لمعيار C 11 لم تكن واضحة في هذا الشأن ، مما أدى إلى رفع إصدار CWG لعام 2011 لتقديم التوضيح. تتم معالجة هذه المشكلة في التطوير المستمر لمعيار C. يتم ترك التعبيرات الهوية التي تشير إلى الكيانات التي تم التقاطها بالرجوع بمفردها وتستمر في الإشارة إلى نفس الكيان الذي كان قد يشيرون إليه في نطاق المرفق.
في الكود أعلاه ، الكيان الذي تم التقاطه هو المعلمة x من دالة make_function ، التي تقع ضمن نطاق الوصول من lambda. لذلك ، يشير المرجع x في تعبير Lambda إلى المتغير الأصلي المعلن في الوظيفة الرئيسية. ومع ذلك ، هناك سيناريوهات محدودة يمكن الرجوع فيها إلى المرجع خارج حياتها. بشكل عام ، يتم الإعلان عن المرجع إما في النطاق أو هو عضو في الفصل ، وفي هذه الحالة يجب أن يكون الفصل نفسه في غضون حياته.
لذلك ، لا يحظر المعيار بشكل صريح استخدام المراجع خارج حياتها. سمحت هذه الثغرة لالتقاط المراجع بالرجوع إليها في تعبيرات Lambda. أثر حل هذه القضية عن غير قصد على مواصفات التقاط Lambda بالرجوع إلى المراجع. ومع ذلك ، فمن المتوقع أن يتم إصلاح هذا الانحدار قبل إطلاق C 17.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3