যখন "এটি" ল্যাম্বডা দ্বারা বন্দী হয়, তখন কি এটি স্পষ্টভাবে ব্যবহার করতে হবে?


27

আমি যে উদাহরণগুলি পেয়েছি যে thisল্যাম্বডায় ক্যাপচার তা স্পষ্টভাবে ব্যবহার করে; উদাহরণ:

capturecomplete = [this](){this->calstage1done();};

তবে মনে হয় এটি সুস্পষ্টভাবে ব্যবহার করাও সম্ভব; উদাহরণ:

capturecomplete = [this](){calstage1done();};

আমি এটি জি ++ তে পরীক্ষা করেছি এবং এটি সংকলিত হয়েছে।

এই স্ট্যান্ডার্ড সি ++? (এবং যদি তাই হয় তবে কোন সংস্করণ), বা এটি কোনও প্রকারের এক্সটেনশান?


1
উত্তরগুলি সঠিক, তবে this->স্পষ্টতই ব্যবহার করার একটি সম্ভাব্য কারণ রয়েছে , যা নিশ্চিত করা যে স্পষ্টভাবে ক্যাপচার করা মানগুলি স্পষ্টভাবে ব্যবহার করা হয়েছে। দ্রষ্টব্য যে [](){ calstage1done(); }আইনী হবে না, কারণ thisধরা পড়েনি; কিন্তু যখন ক্যাপচার thisস্পষ্টভাবে, এটা বিস্ময়কর ব্যাপার ফাংশন বডির করার জন্য প্রদর্শিত করতে আসলে দখল মান ব্যবহার এক নজরে না: [this](){ calstage1done(); }।
— কাইল স্ট্র্যান্ড

আমি এটি দেখতে বাছাই করতে পারি, তবে একই সাথে এটি একটি সাধারণ কাজটি কী হওয়া উচিত তার জন্য ভয়াবহ ভারবস বলে মনে হয়।
— প্লাগওয়াশ

1
আমার মনে আছে এমএসভিসি (সম্ভবত কেবলমাত্র 2015) thisল্যাম্বডায় এটি ক্যাপচার এবং ব্যবহারে সমস্যা রয়েছে যা এটি স্পষ্টভাবে ব্যবহার করার কারণ হতে পারে
— ফ্ল্যামফায়ার

@ প্লাগওয়াশ: বিকাশকারীরা সর্বদা অলস হয়ে থাকে এবং জিনিসগুলি হ্রাস করতে চায় এবং ভাষা ডিজাইনাররা এর চেয়ে আলাদাও নয়। তবে অস্পষ্টতাকে সমাধান করার জন্য প্রায়শই ভার্বোসিটির প্রয়োজন হয় এবং এখানেও এটি ঘটে।
— ফ্ল্যাটার

উত্তর:


25

এটি স্ট্যান্ডার্ড এবং ল্যাম্বডাস যুক্ত হওয়ার পরে সি ++ 11 সাল থেকে এই পথে চলেছে। সিপ্রেফারেন্স.কম অনুসারে :

নাম অনুসন্ধানের লক্ষ্যে, thisপয়েন্টারের ধরণ এবং মান নির্ধারণ এবং অ স্থিত শ্রেণীর সদস্যদের অ্যাক্সেসের জন্য, ক্লোজার টাইপের ফাংশন কল অপারেটরের প্রধান অংশটি ল্যাম্বডা-এক্সপ্রেশনের প্রসঙ্গে বিবেচনা করা হয়।

struct X {
    int x, y;
    int operator()(int);
    void f()
    {
        // the context of the following lambda is the member function X::f
        [=]()->int
        {
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        };
    }
};

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.