c++ - لماذا لا يمكن أن يكون عضو البيانات في قائمة التقاط لامبدا




c++11 lambda (2)

يمكن التقاط الكائنات ذات مدة التخزين التلقائي فقط بواسطة لامدا في C ++ 11 (أي المتغيرات المحلية والمعلمات الوظيفية). إذا كنت تريد تأثير التقاط عضو بيانات فئة non-static ، فيمكنك إما التقاط this المؤشر كما في إجابة Danvil :

auto f = [this]{ std::cout << a << std::endl; };

أو تخزين قيمة العضو في ذاكرة التخزين المؤقت في متغير محلي والتقاط ذلك:

auto a = this->a;
auto f = [a]{ std::cout << a << std::endl; };

والذي سيكون أكثر إيجازًا في C ++ 14:

auto f = [a = this->a]{ std::cout << a << std::endl; };

يعتمد الاختيار بين هذين الخيارين على ما إذا كنت تريد تخزين القيمة الموجودة الآن أو إذا كنت ترغب في استرداد القيمة الموجودة عند استدعاء lambda . لاحظ أنه في حالة التقاط this يجب عليك التأكد من أن عمر كائن المؤشر يحيط عمر lambda استدعاء lambda بعد إتلاف الكائن له سلوك غير معروف. والحالة الأكثر بساطة التي تلتقط نسخة من a هي مكتفية ذاتيا تماما وليس لديها مثل هذه القضايا مدى الحياة.

لدي فئة foo يحتوي على bar كمتغير عضو.

في وظيفة عضو أخرى من الفصل ، أكتب وظيفة لامدا:

[bar](void){}

ولكن لا يمكنني تضمين bar في قائمة الالتقاط. لماذا هذا؟


يمكنك التقاط أعضاء الفصل بقول this في قائمة الالتقاط. هذا لا علاقة له بحقيقة أن العضو هو const .

مثال:

#include <iostream>

struct Foo
{
    const int a = 0;
    int b;
    Foo() : b{42} {
        auto f = [this]() { std::cout << a << " " << b << std::endl; };
//                ^^^^ 
        f();
    }
};

int main() {
    Foo x;
}




lambda