c++ - Choosing between template instantiation with pointer arguments -


निम्नलिखित परीक्षण कोड देखें:

  टेम्पलेट & lt; class T & gt; संरचना लपेटें {}; टेम्पलेट & lt; typename T & gt; इनलाइन व्यर्थ मज़े (टी * एंड इंट) // ** पसंद 1 ** {} टेम्पलेट & lt; typename T & gt; इनलाइन शून्य मजेदार (लपेटें & lt; T & gt; * & amp; Int) // ** पसंद 2 ** {} int main () {int i = 6; मज़ा ((चार * & amp;) (i)); // ** कॉल 1 ** मज़ेदार ((लपेटें & lt; char & gt; * & amp;) (i)); // ** कॉल 2 **}   

जब मैं इस कोड को लिनक्स जी ++ में चलाता हूं, तो यह अपेक्षाओं के अनुसार काम करता है। जब मज़े () को चार * और कहा जाता है, तो इसे पसंद का कार्य 1 सीधे आगे होता है हालांकि, मुझे दिलचस्पी है जब हम रैप के साथ मज़ा () कॉल करते हैं; चार & gt; * & amp; और यह विकल्प कहता है 2. हालांकि चुनाव 1 और 2 दोनों दूसरे कॉल के लिए मान्य हैं, संकलक थोड़ा बेहतर दावेदार चुनने के लिए प्रबंधन करता है - & gt; पसंद 2 (क्योंकि यह मौजूद है)।

प्रश्न : क्या यह गारंटी है कि, सी ++ के लिए किसी भी अन्य कंपाइलर के लिए समान व्यवहार बनाए रखा जाएगा? यदि नहीं, तो क्या यह तय करने वाला कोई अन्य विकल्प है?

हालांकि कोड एक जैसा दिख सकता है टेम्पलेट विशेषज्ञता, यह मामला नहीं है। भाषा आंशिक टेम्पलेट फ़ंक्शन विशेषताओं के लिए अनुमति नहीं देती है दो वे असंबंधित टेम्पलेट जो ओवरलोड होने वाले होते हैं।

संकलक कॉल को मज़ेदार ((लपेटें & lt; char & gt; * & amp; i) पर सामान्य लुकअप के साथ देखेंगे तंत्र, दो टेम्पलेट पाएंगे और निर्धारित करेंगे कि दो संभावित अधिभार हैं:

  टेम्पलेट & lt; typename T & gt; शून्य मज़ेदार (टी * & amp;); // टी के साथ == लपेटें & lt; char & gt; टेम्पलेट & lt; typename T & gt; ओवरलैस रिजॉल्यूशन तब निर्धारित करेगा कि दूसरा एक बेहतर मैच है और इसे इंस्टाटिव करें। यह मानक की गारंटी है, लेकिन सावधान रहें: वे एक ही टेम्पलेट नहीं हैं, बल्कि अलग-अलग टेम्पलेट हैं और आप अनपेक्षित परिणामों में चल सकते हैं। आलेख @ लीकाओ को और अधिक जानकारी के लिए लिंक करें।   

Comments