তারা যদি সম্পর্কিত হয়
আসুন এক মুহুর্তের জন্য ধরে নেওয়া যাক B
এটি আসলে একটি ভিত্তি D
। তারপরে কল করার জন্য check
, উভয় সংস্করণ কার্যকরযোগ্য কারণ Host
রূপান্তরিত হতে পারে D*
এবং B*
। এটা একটা ব্যবহারকারী সংজ্ঞায়িত রূপান্তর ক্রম হিসাবে বর্ণনা করেন 13.3.3.1.2
থেকে Host<B, D>
থেকে D*
এবং B*
যথাক্রমে। শ্রেণি রূপান্তর করতে পারে এমন রূপান্তর ফাংশনগুলি সন্ধানের জন্য, নিম্নলিখিত প্রার্থীর check
ফাংশন অনুসারে প্রথম ফাংশনের জন্য সংশ্লেষ করা হয়13.3.1.5/1
D* (Host<B, D>&)
প্রথম রূপান্তর ফাংশনটি কোনও প্রার্থী নয়, কারণ এতে B*
রূপান্তর করা যায় না D*
।
দ্বিতীয় কার্যের জন্য, নিম্নলিখিত প্রার্থীরা উপস্থিত আছেন:
B* (Host<B, D> const&)
D* (Host<B, D>&)
এই দুটি রূপান্তর ফাংশন প্রার্থী যারা হোস্ট অবজেক্ট গ্রহণ করে। প্রথমটি এটি কনস্ট্যান্ড রেফারেন্স দ্বারা গ্রহণ করে, এবং দ্বিতীয়টি তা গ্রহণ করে না। সুতরাং দ্বিতীয়টি নন-কনস্ট্যান্ট *this
অবজেক্টের জন্য আরও ভাল ম্যাচ ( অন্তর্নিহিত অবজেক্ট আর্গুমেন্ট ) দ্বারা 13.3.3.2/3b1sb4
এবং B*
দ্বিতীয় check
ফাংশনে রূপান্তর করতে ব্যবহৃত হয় ।
আপনি যদি কনস্টেন্টটি সরিয়ে ফেলেন তবে আমাদের নীচের প্রার্থীরা থাকবেন
B* (Host<B, D>&)
D* (Host<B, D>&)
এর অর্থ হ'ল আমরা আর দৃ const়তার সাথে নির্বাচন করতে পারি না। একটি সাধারণ ওভারলোড রেজোলিউশন দৃশ্যে, কলটি এখন অস্পষ্ট হবে কারণ সাধারণত রিটার্নের ধরণটি ওভারলোড রেজোলিউশনে অংশ নেয় না। রূপান্তর ফাংশনগুলির জন্য, তবে একটি পিছনের কাজ রয়েছে। দুটি রূপান্তর ফাংশন যদি সমানভাবে ভাল হয় তবে তার মধ্যে ফেরতের ধরণটি সিদ্ধান্ত নেয় যে অনুযায়ী কে সেরা 13.3.3/1
। সুতরাং, আপনি যদি কনটটি অপসারণ করেন, তবে প্রথমটি নেওয়া হবে, কারণ তার চেয়ে B*
ভাল রূপান্তরিত হয় ।B*
D*
B*
এখন কোন ব্যবহারকারী সংজ্ঞায়িত রূপান্তর ক্রম ভাল? দ্বিতীয় বা প্রথম চেক ফাংশনটির জন্য একটি? নিয়মটি হল যে ব্যবহারকারীর সংজ্ঞায়িত রূপান্তর সিকোয়েন্সগুলি কেবল তখনই তুলনা করা যেতে পারে যদি তারা একই রূপান্তর ফাংশন বা কনস্ট্রাক্টর অনুসারে ব্যবহার করে 13.3.3.2/3b2
। ঠিক এখানে ঘটনাটি: উভয়ই দ্বিতীয় রূপান্তর ফাংশনটি ব্যবহার করে। লক্ষ করুন যে এইভাবে কনস্টটিপটি গুরুত্বপূর্ণ কারণ এটি কম্পাইলারকে দ্বিতীয় রূপান্তর ফাংশন নিতে বাধ্য করে।
যেহেতু আমরা তাদের তুলনা করতে পারি - কোনটি ভাল? নিয়মটি হ'ল রূপান্তর ফাংশনের রিটার্ন টাইপ থেকে গন্তব্য প্রকারের (আবার দ্বারা 13.3.3.2/3b2
) জিতে আরও ভাল রূপান্তর । এই ক্ষেত্রে, তুলনায় D*
ভাল রূপান্তর । এইভাবে প্রথম ফাংশনটি নির্বাচিত হয় এবং আমরা উত্তরাধিকারকে স্বীকৃতি দেব!D*
B*
লক্ষ করুন যে, যেহেতু আমরা করা প্রয়োজন কখনোই আসলে একটি বেস বর্গ রূপান্তর, আমরা যার ফলে চিনতে পারে ব্যক্তিগত উত্তরাধিকার কারণ কিনা আমরা একটি থেকে রূপান্তর করতে পারেন D*
একটি থেকে B*
অনুযায়ী উত্তরাধিকার আকারে উপর নির্ভরশীল নয়4.10/3
তারা সম্পর্কিত না হলে
এখন ধরা যাক তারা উত্তরাধিকারসূত্রে সম্পর্কিত নয়। সুতরাং প্রথম ফাংশনের জন্য আমাদের নিম্নোক্ত প্রার্থী রয়েছে
D* (Host<B, D>&)
এবং দ্বিতীয় জন্য আমাদের এখন অন্য সেট আছে
B* (Host<B, D> const&)
যেহেতু আমরা উত্তরাধিকারের সম্পর্ক না পেয়ে আমরা রূপান্তর D*
করতে পারি না B*
, তাই এখন আমরা দুটি ব্যবহারকারীর সংজ্ঞায়িত রূপান্তর ক্রমের মধ্যে কোনও সাধারণ রূপান্তর ফাংশন নেই! প্রথম ফাংশনটি একটি টেমপ্লেট এই বিষয়টির জন্য না হলে আমরা অস্পষ্ট হয়ে উঠব । টেমপ্লেট যখন একটি অ-টেমপ্লেট ফাংশন যা সমানভাবে ভাল অনুযায়ী সেখানে দ্বিতীয় পছন্দ 13.3.3/1
। সুতরাং, আমরা অ টেমপ্লেট ফাংশন (দ্বিতীয়) নির্বাচন করুন এবং আমরা স্বীকার মধ্যে কোন উত্তরাধিকার নেই B
এবং D
!