কোনও সরঞ্জামচেইনে সংকলনের জন্য মানটির প্রয়োজন হয় না !
প্রথমটি স্মরণ করুন যা vector<bool>অদ্ভুত এবং এটিকে সাবস্ক্রিপশন করা আপনাকে প্রকৃতের std::vector<bool>::referenceপরিবর্তে প্রক্সি প্রকারের একটি অস্থায়ী অবজেক্ট দেয় bool&।
ত্রুটি বার্তাটি আপনাকে বলছে যে এটি constজেনেরিক template <typename T> std::swap(T& lhs, T& rhs)প্রয়োগের ক্ষেত্রে অস্থায়ী রেফারেন্সটিতে এই অস্থায়ীটিকে আবদ্ধ করতে পারে না ।
এক্সটেনশানগুলি!
যাইহোক, দেখা যাচ্ছে যে libstdc ++ এর জন্য একটি ওভারলোডকে সংজ্ঞায়িত করেstd::swap(std::vector<bool>::reference, std::vector<bool>::reference) তবে এটি স্ট্যান্ডার্ডের একটি এক্সটেনশন (বা এটি যদি সেখানে থাকে তবে আমি এর পক্ষে কোনও প্রমাণ পাই না)।
libc ++ এটিও করে ।
আমি অনুমান করেছি যে ভিজ্যুয়াল স্টুডিও স্টাডলিব বাস্তবায়ন, যা আপনি এখনও ব্যবহার করছেন, তা নয় , তবে আঘাতের অপমানের জন্য আপনি ভিএস- তে রেফারেন্সগুলি মূল্যায়নের জন্য অস্থায়ী সংস্থাগুলি আবদ্ধ করতে পারেন (যদি না আপনি কনফারেন্স মোড ব্যবহার করছেন), স্ট্যান্ডার্ড, "জেনেরিক", std::swapফাংশন কার্যকর হয় যতক্ষণ না আপনি কঠোর কলং সংকলকটির জন্য ভিএস সংকলককে বিকল্প হিসাবে স্থান দেন।
ফলস্বরূপ, আপনি যে তিনটি সরঞ্জামচেনের জন্য এটি আপনার জন্য কাজ করেছে সেগুলির সমস্তটির উপরেই আপনি এক্সটেনশনের উপর নির্ভর করছেন এবং উইন্ডোজ সংমিশ্রণে কলঙ্কটি কেবলমাত্র কঠোর সম্মতি প্রদর্শনকারী।
(আমার মতে, এই তিনটি সরঞ্জামচেনগুলি এটি নির্ণয় করা উচিত ছিল যাতে আপনি পুরো সময় অ-বহনযোগ্য কোডটি প্রেরণ না করে 😊)
এখন কি?
এটা আপনার নিজের বিশেষজ্ঞতা যোগ করার জন্য প্রলুব্ধ হতে পারে std::swapএবং std::vector<bool>::reference, কিন্তু আপনি মান ধরনের জন্য এই কাজ করতে মঞ্জুরিপ্রাপ্ত নন; প্রকৃতপক্ষে, এটি ওভারলোডগুলির সাথে দ্বন্দ্ব করবে যেগুলি libstdc ++ এবং libc ++ এক্সটেনশন হিসাবে যুক্ত করতে বেছে নিয়েছে।
সুতরাং, বহনযোগ্য এবং অনুগত হতে আপনার কোড পরিবর্তন করা উচিত ।
সম্ভবত একটি ভাল পুরানো:
const bool temp = vb[0];
vb[0] = vb[1];
vb[1] = temp;
বা বিশেষ স্থিতিশীল সদস্য ফাংশনটি ব্যবহার করুন যা আপনি যা চান ঠিক তেমন করে :
std::vector<bool>::swap(vb[0], vb[1]);
নিম্নরূপ স্পেলেযোগ্য:
vb.swap(vb[0], vb[1]);
operator[]কোনও মূল্যমানের ফলাফল কি ? এবংstd::swapমূল্য এবং xvalue কাজ করতে পারেন ?