auto
নিরব অন্তর্নিহিত রূপান্তরগুলি এড়িয়ে পারফরম্যান্সে সহায়তা করতে পারে । আমি উদাহরণস্বরূপ আকর্ষণীয় মনে করি যা নিম্নলিখিত।
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
বাগটি দেখুন? আমরা এখানে রয়েছি, ভেবেছি আমরা মানচিত্রের প্রতি আইটেমটি মার্জিতভাবে নিচ্ছি এবং রেফারেন্সের জন্য এক্সপ্রেশনটি ব্যবহার করে আমাদের উদ্দেশ্যটি পরিষ্কার করে দিচ্ছি, তবে বাস্তবে আমরা প্রতিটি উপাদান নকল করছি । এ কারণে যে std::map<Key, Val>::value_type
হয় std::pair<const Key, Val>
না std::pair<Key, Val>
। সুতরাং, যখন আমাদের (অন্তর্নিহিত) থাকে:
std::pair<Key, Val> const& item = *iter;
কোনও বিদ্যমান অবজেক্টের রেফারেন্স নেওয়ার পরিবর্তে এটিকে রেখে যাওয়ার জন্য, আমাদের একটি ধরণের রূপান্তর করতে হবে। যতক্ষণ না কোনও অন্তর্নিহিত রূপান্তর উপলব্ধ থাকে ততক্ষণ আপনি আলাদা ধরণের কোনও অবজেক্টের (বা অস্থায়ী) রেফারেন্স নিতে পারবেন:
int const& i = 2.0; // perfectly OK
টাইপ রূপান্তর একই কারণে আপনি যদি একটি রূপান্তর করতে পারেন জন্য একটি অনুমতি অন্তর্নিহিত রূপান্তর হয় const Key
একটি থেকে Key
, কিন্তু আমরা অর্ডার যে জন্য অনুমতি নতুন ধরনের একটি অস্থায়ী গঠন করা হবে। সুতরাং, কার্যকরভাবে আমাদের লুপটি করে:
std::pair<Key, Val> __tmp = *iter; // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
(অবশ্যই, আসলে কোনও __tmp
বস্তু নেই, এটি কেবল উদাহরণের জন্য রয়েছে, বাস্তবে নামবিহীন অস্থায়ী item
তার জীবনকালের জন্য আবদ্ধ )।
কেবল এতে পরিবর্তন করা হচ্ছে:
for (auto const& item : m) {
// do stuff
}
সবেমাত্র আমাদের এক টন অনুলিপি সংরক্ষণ করেছেন - এখন রেফারেন্স করা প্রকারটি আরম্ভকারী প্রকারের সাথে মেলে, তাই কোনও অস্থায়ী বা রূপান্তর প্রয়োজন হয় না, আমরা কেবল প্রত্যক্ষ রেফারেন্স করতে পারি।