সি ++ 11 ল্যাম্বডাস কি তারা ব্যবহার করে না ভেরিয়েবলগুলি ক্যাপচার করে?


124

আমি যখন এই নির্দেশটি ব্যবহার করি [=]যে আমি চাই যে সমস্ত স্থানীয় ভেরিয়েবলগুলি ল্যাম্বডায় মান দ্বারা ক্যাপচার করা হবে, তার ফলে ফাংশনটির সমস্ত স্থানীয় ভেরিয়েবলগুলি অনুলিপিযুক্ত হবে, বা ল্যাম্বডায় ব্যবহৃত সমস্ত স্থানীয় ভেরিয়েবলগুলি কী ফলাফল করবে ?

সুতরাং, উদাহরণস্বরূপ, যদি আমার কাছে থাকে:

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });

আমি ল্যাম্বডায় এটি ব্যবহার না করেও কি আমার_হিউজ_ভেক্টরটি অনুলিপি করা হবে?

উত্তর:


115

ক্যাপচার তালিকায় স্পষ্টভাবে নামের প্রতিটি পরিবর্তনশীল ক্যাপচার করা হয় is ডিফল্ট ক্যাপচার কেবলমাত্র ভেরিয়েবলগুলি ক্যাপচার করবে যা উভয় (ক) ক্যাপচার তালিকায় স্পষ্টরূপে নামকরণ করা হয়নি এবং (খ) ল্যাম্বডা এক্সপ্রেশনের শরীরে ব্যবহৃত হয়। যদি কোনও ভেরিয়েবলের স্পষ্টরূপে নাম না দেওয়া হয় এবং আপনি ল্যাম্বদা এক্সপ্রেশনে ভেরিয়েবলটি ব্যবহার না করেন তবে ভেরিয়েবলটি ক্যাপচার করা হয় না। আপনার উদাহরণে my_huge_vectorধরা পড়ে না।

প্রতি সি ++ 11 §5.1.2 [এক্সপিআর.প্রিম.লাম্বদা] / ১১:

যদি কোনও ল্যাম্বডা-এক্সপ্রেশনটির সাথে সম্পর্কিত ক্যাপচার-ডিফল্ট থাকে এবং এর যৌগিক-বিবৃতি অর-ব্যবহার হয় this বা স্বয়ংক্রিয় স্টোরেজ সময়কালের সাথে কোনও ভেরিয়েবল থাকে এবং ওডার-ব্যবহৃত সত্তা সুস্পষ্টভাবে ক্যাপচার না করা হয়, তবে অদ্ভুত-ব্যবহৃত সত্তাকে সুস্পষ্টভাবে ক্যাপচার করা হয়েছে বলে বলা হয়।

আপনার ল্যাম্বডা এক্সপ্রেশনটির একটি সম্পর্কিত ক্যাপচার ডিফল্ট রয়েছে: ডিফল্টরূপে, আপনি মানটি ব্যবহার করে ভেরিয়েবলগুলি ক্যাপচার করেন [=]

যদি এবং কেবলমাত্র কোনও ভেরিয়েবল ব্যবহার করা হয় ("ব্যবহৃত" শব্দের এক সংজ্ঞা বিধানে) একটি পরিবর্তনশীল স্পষ্টভাবে ক্যাপচার করা হয়। যেহেতু আপনি my_huge_vectorল্যাম্বডা এক্সপ্রেশনটির শরীরে ("যৌগিক বিবৃতি") ব্যবহার করবেন না , তাই এটি স্পষ্টতই ক্যাপচার করা হয়নি।

§5.1.2 / 14 সহ চালিয়ে যেতে

একটি সত্তা অনুলিপি দ্বারা ক্যাপচার করা হয় যদি

  • এটি সুস্পষ্টভাবে ক্যাপচার এবং ক্যাপচার-ডিফল্ট হয় =বা যদি
  • এটি স্পষ্টভাবে একটি ক্যাপচারের সাথে ক্যাপচার করা হয় যাতে একটি অন্তর্ভুক্ত হয় না &

যেহেতু আপনার my_huge_vectorস্পষ্টরূপে ক্যাপচার করা হয়নি এবং এটি স্পষ্টভাবে ক্যাপচার করা হয়নি, এটি অনুলিপি, অনুলিপি বা রেফারেন্সের মাধ্যমে ধরা পড়ে না।


10
তোমার কি পবিত্র উক্তি আছে?
GManNickG

তবে আমি বলব, সমস্ত বিবরণ বোঝার জন্য §5.1.2 এর সম্পূর্ণতা গুরুত্বপূর্ণ। এই বিভাগে অনেকগুলি প্রযুক্তিগত শর্তাবলী সংজ্ঞায়িত করা হয়েছে এবং ল্যাম্বডা এক্সপ্রেশনগুলির বিভিন্ন উপাদানগুলির সংজ্ঞাগুলি প্রয়োজনীয়ভাবে জড়িত থাকার কারণে সংক্ষিপ্ত উদ্ধৃতিগুলি বের করা কঠিন যে "এটাই এক্স এবং এই কারণেই এক্স"।
জেমস ম্যাকনেলিস

আপনার মনোযোগের জন্য এখানে পিংগিং , যা বলে যে এই ধরনের অনুকূলকরণের অনুমতি নেই, কমপক্ষে স্পষ্টত নামযুক্ত ভেরিয়েবলের জন্য। আমি কোথায় লাইন আঁকতে হবে তা নিশ্চিত নই।
GManNickG

@ জিএমনিকজি: এটি কিছু শক্তিশালী ভাল ট্রোলিং ;-)। আমি বুঝতে পেরেছিলাম যে এই লিঙ্কটির আসলে আমি এই পৃষ্ঠায় নির্দিষ্ট করেছিলাম তার আগে তিনটি ভাল ক্লিক পেয়েছিল ...: - ও [যে কোনও ক্ষেত্রে, আমি কাল সকালে অফিসে whenুকলে আপডেট করব এবং ভাষাটি আবার পড়ব যথাযথভাবে উত্তরটি দিন]]
জেমস ম্যাকনেলিস

ওহ বাজে, দুঃখিত !!! আমার প্রশ্নের উত্তর দেওয়া হয়েছিল, আমি এখানে পরিবর্তে লিঙ্কিং করতে চাইছিলাম। নিশ্চয়ই তা ভীষণ বিভ্রান্তিকর হয়েছে।
GManNickG

16

না, my_huge_vectorধরা পড়বে না। [=]মানে সমস্ত ব্যবহৃত ভেরিয়েবলগুলি ল্যাম্বডায় বন্দী।


6
হাঁ। নোট করুন যে ব্যবহৃত একটি প্রযুক্তিগত শব্দ, যদিও এবং সত্যিকার অর্থে ব্যবহৃত ওয়ান সংজ্ঞা বিধি ব্যবহৃত হয় । সুতরাং, উদাহরণস্বরূপ, বিবেচনা করুন void f() { const int size(10); [] { int x[size]; }; }। এখানে, sizeধরা পড়ে না তবে এটি ঠিক আছে কারণ এটি ওডিআর অর্থে ব্যবহৃত হয় না। (ভিজ্যুয়াল সি ++ ২০১০ এই কোডটি গ্রহণ করে না, কারণ ভিসি 10 প্রকাশের পরে অনুমিত পরিবর্তন হয়েছে বা বাগের কারণে সম্ভবত এটি আসন্ন সংস্করণে সংশোধন করা হবে; জি ++ 4.5.1 এটি গ্রহণ করে।)
জেমস ম্যাকনেলিস

@ জামেসমিসনেলিস চিন্তিত করবেন না, এমএসভিসি আজও দুর্গন্ধযুক্ত কুঁকড়ে আছে ile cf. Godbolt.org/z/vHnnCX ( লুলজের জন্য জিসিসি পরীক্ষা করুন)। বলেছিল; আমি বুঝতে পারি না যে কোনও মূল্যায়িত অভিব্যক্তিতে উপস্থিত কোনও শনাক্তকারী ওডিআর-ব্যবহার করা হবে না কেন। আমি মনে করি এই মামলাটি অবশ্যই ওডিআর-ব্যবহৃত হয় যদি না আপনি বোঝেন যে এটি কনস্টেক্সপ্র হিসাবে ব্যাখ্যা করা যেতে পারে সুতরাং কেবলমাত্র মানটি কার্যকর? আমি নিশ্চিত নই যে সংকলকটি ধরে নিচ্ছে যে constস্টাফগুলি সম্ভাব্য রূপান্তরিত করবে না। সুপার আক্রমণাত্মক অপ্টিমাইজেশান পতাকা OX বা স্টাফ না থাকলে।
v.oddou
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.