সি ++ 0 এক্স লম্বা ক্যাপচারটি মান দ্বারা সর্বদা কনস্টেট হয়?


102

মান অনুসারে ক্যাপচার এবং ক্যাপচারিত মানটিকে অ-কনস্ট্যান্ট করার কোনও উপায় আছে কি? আমার কাছে একটি লাইব্রেরির ফান্টর রয়েছে যা আমি ক্যাপচার এবং এমন পদ্ধতিতে কল করতে চাই যা নন-কনস্ট্যান্ড তবে এমন হওয়া উচিত।

নিম্নলিখিত foo :: অপারেটর () কনট সংশোধন করে তা সংকলন করে না।

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}

উত্তর:


165

পরিবর্তনীয় ব্যবহার করুন।


auto bar = [=] () mutable -> bool ....

পরিবর্তনীয় ছাড়াই আপনি ল্যাম্বদা অবজেক্ট কনস্টের অপারেটর () ঘোষণা করছেন।


-5

পরিবর্তনীয় ব্যবহারের বিকল্প উপায় আছে (ক্রেজি এডি প্রস্তাবিত সমাধান)।

সঙ্গে [=] স্রেফ আপনার ব্লকের মান দ্বারা সমস্ত বস্তু ধারন করে না। আপনি রেফারেন্স দ্বারা সমস্ত অবজেক্ট ক্যাপচার করতে [&] ব্যবহার করতে পারেন:

auto bar = [&] () -> bool

বা আপনি রেফারেন্স দ্বারা কতিপয় নির্দিষ্ট অবজেক্ট [=, এবং আরও]] ক্যাপচার করতে পারেন :

auto bar = [=, &afoo] () -> bool

পূর্বের বিশদ ( ব্যাখ্যা বিভাগ) এর জন্য এই পৃষ্ঠাটি দেখুন : http://en.cppreferences.com/w/cpp/language/lambda


11
এটি সম্পূর্ণ ভিন্ন জিনিস করে। এগুলি বিনিময়যোগ্য নয়। এটি ওপি-র প্রশ্নের জবাব দেয় না।
এডওয়ার্ড অদ্ভুত

1
এই সমাধানের সমস্যাটি হ'ল ল্যাম্বডা কার্যকর হওয়ার আগে নষ্ট হওয়া স্থানীয় ভেরিয়েবলগুলির জন্য এটি কাজ করে না (উদাহরণস্বরূপ, যখন আপনি কোনও পৃথক স্টাড :: থ্রেড শুরু করেন)।
সাইমন নিনন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.