আমি মনে করি কলঙ্ক আসলেই সঠিক হতে পারে।
মতে [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
।