নিম্নলিখিতগুলি সংকলন করে না :
#include <iostream>
int main()
{
int a{},b{},c{},d{};
for (auto& s : {a, b, c, d}) {
s = 1;
}
std::cout << a << std::endl;
return 0;
}
সংকলক ত্রুটিটি হ'ল: error: assignment of read-only reference 's'
এখন আমার আসল ক্ষেত্রে তালিকাটি একটি শ্রেণীর সদস্য ভেরিয়েবল দ্বারা তৈরি।
এখন, এটি কাজ করে না কারণ অভিব্যক্তিটি এমন একটি হয়ে যায় initializer_list<int>
যা আসলে একটি, বি, সি এবং ডি অনুলিপি করে - তাই পরিবর্তনের অনুমতি দেয় না।
আমার প্রশ্ন দ্বিগুণ:
এইভাবে লুপের জন্য একটি পরিসীমা-ভিত্তিক লিখতে না দেওয়ার পিছনে কি কোনও প্রেরণা রয়েছে? যেমন। নগ্ন ধনুর্বন্ধনী অভিব্যক্তিগুলির জন্য একটি বিশেষ কেস হতে পারে।
এই ধরণের লুপটি ঠিক করার সিনট্যাক্টিক্যাল ঝরঝরে উপায় কী ?
এই লাইন বরাবর কিছু পছন্দ করা হবে:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
আমি পয়েন্টার ইন্ডিয়ারেশনকে একটি ভাল সমাধান হিসাবে বিবেচনা করি না (যা {&a, &b, &c, &d}
) - পুনরুক্তিটি ডি-রেফারেন্স করা হলে যে কোনও সমাধানের ক্ষেত্রে উপাদানটিকে সরাসরি রেফারেন্স দেওয়া উচিত ।
initializer_list
বেশিরভাগ const
অ্যারেতে দেখা হয়।
{ &a, &b, &c, &d }
, আপনি তন্ন তন্ন চাই না:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
।