আমি মনে করি কলঙ্ক আসলেই সঠিক হতে পারে।
মতে [lambda.capture] / 11 , একটি আইডি প্রকাশ ল্যামডা ব্যবহৃত ল্যামডা এর উপ-কপি-ব সদস্য শুধুমাত্র যদি এটি একটি গঠন বোঝায় odr ব্যবহারযোগ্য । যদি এটি না হয়, তবে এটি আসল সত্তাকে বোঝায় । এটি সি ++ 11 সাল থেকে সমস্ত সি ++ সংস্করণে প্রযোজ্য।
সি ++ 17 এর [বেসলাল.দেব.অর্ডার] / 3 অনুসারে যদি লভ্যালু-টু-রাল্যু রূপান্তরটি প্রয়োগ করে একটি ধ্রুবক অভিব্যক্তি পাওয়া যায় তবে একটি রেফারেন্স ভেরিয়েবল অদ্ভুত ব্যবহার হয় না।
C ++ 20 খসড়াতে তবে লভ্যালু-থেকে-রুল্যু রূপান্তরটির প্রয়োজনীয়তা বাদ দেওয়া হয়েছে এবং প্রাসঙ্গিক প্যাসেজটি রূপান্তরকে অন্তর্ভুক্ত বা অন্তর্ভুক্ত করতে একাধিকবার পরিবর্তিত হয়েছে। দেখুন ফিটনেসে সমস্যা 1472 এবং ফিটনেসে সমস্যা 1741 , সেইসাথে খোলা ফিটনেসে সমস্যা 2083 ।
যেহেতু mধ্রুবক অভিব্যক্তি (স্থিতিশীল স্টোরেজ সময়কাল অবজেক্টের উল্লেখ করে) দিয়ে আরম্ভ করা হয়েছে, এটি ব্যবহার করে [expr.const] / ২.১১.১ এ ব্যতিক্রম হিসাবে ধ্রুবক প্রকাশ পাওয়া যায় ।
লভ্যালু-টু-রালভ্য রূপান্তরগুলি প্রয়োগ করা হয় তবে এটি ক্ষেত্রে নয়, কারণ nধ্রুবক অভিব্যক্তিতে এর মান ব্যবহারযোগ্য হয় না।
অতএব, ল্যাম্বু-এ-রালভু রূপান্তরগুলি গন্ধ-ব্যবহার নির্ধারণের জন্য প্রয়োগ করা হবে কিনা তার উপর নির্ভর করে আপনি যখন mল্যাম্বডায় ব্যবহার করেন , তখন এটি ল্যাম্বডা সদস্যকে উল্লেখ করতে পারে বা নাও পারে।
যদি রূপান্তরটি প্রয়োগ করা উচিত, জিসিসি এবং এমএসভিসি সঠিক, অন্যথায় ঝনঝন is
আপনি দেখতে পাচ্ছেন যে আপনি যদি mআর ধ্রুবক অভিব্যক্তি না হওয়ার সূচনাটি পরিবর্তন করেন তবে ক্ল্যাং এর আচরণ পরিবর্তন করে :
#include <stdio.h>
#include <functional>
int n = 100;
void g() {}
std::function<int()> f()
{
int &m = (g(), n);
return [m] () mutable -> int {
m += 123;
return m;
};
}
int main()
{
int x = n;
int y = f()();
int z = n;
printf("%d %d %d\n", x, y, z);
return 0;
}
এই ক্ষেত্রে সমস্ত সংকলক আউটপুট যে সম্মত হন
100 223 100
কারণ mএ ল্যামডা অবসান এর সদস্য ধরনের যা উল্লেখ করব intরেফারেন্স পরিবর্তনশীল থেকে কপি-সক্রিয়া mমধ্যে f।