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


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.