2013-07-31 19 views
55

के बीच ओवरलोड रिज़ॉल्यूशन सभी तीन कार्यों को देखते हुए, यह कॉल संदिग्ध है।ऑब्जेक्ट, रावल्यू संदर्भ, कॉन्स्ट संदर्भ

int f(int); 
int f(int &&); 
int f(int const &); 

int q = f(3); 

f(int) कारणों दोनों बजना और जीसीसी निकाला जा रहा है lvalue संदर्भ से अधिक rvalue संदर्भ को पसंद करते हैं। लेकिन f(int) के साथ अस्पष्टता में संदर्भ अधिभार परिणामों को हटाने के बजाय।

ओवरलोड रिज़ॉल्यूशन आमतौर पर सख्त आंशिक क्रम के संदर्भ में किया जाता है, लेकिन int दो चीजों के बराबर लगता है जो एक-दूसरे के बराबर नहीं हैं। यहां नियम क्या हैं? मुझे इसके बारे में एक दोष रिपोर्ट याद है।

क्या कोई मौका int && भविष्य में मानक में int से अधिक पसंद किया जा सकता है? संदर्भ को प्रारंभकर्ता से बांधना चाहिए, जबकि ऑब्जेक्ट प्रकार इतना बाध्य नहीं है। इसलिए T और T && के बीच अधिभार प्रभावी ढंग से हो सकता है "अगर मुझे स्वामित्व दिया गया है तो मौजूदा ऑब्जेक्ट का उपयोग करें, अन्यथा प्रतिलिपि बनाएं।" (यह शुद्ध पास-बाय-वैल्यू के समान है, लेकिन आगे बढ़ने के ऊपरी हिस्से को बचाता है।) चूंकि ये कंपाइलर वर्तमान में काम करते हैं, यह T const & और T && ओवरलोडिंग और स्पष्ट रूप से प्रतिलिपि करके किया जाना चाहिए। लेकिन मुझे यह भी यकीन नहीं है कि यह सख्ती से मानक है।

+0

आप राज्य' पूर्णांक && कोड में लेकिन फिर प्रश्न में 'टी &&' को सामान्यीकृत करें, उनके बावजूद अलग-अलग होने के बावजूद। यह क्या है? – Rapptz

+0

@ रैपेटज़ मैंने वास्तविक दुनिया के उपयोग में संभावित अर्थ के बारे में बात करते समय केवल 'टी' कहा था। मेरा मतलब यह नहीं है सही अग्रेषण का सुझाव देते हैं, यह एक पूरी तरह से अलग ballgame है। – Potatoswatter

उत्तर

43

यहां नियम क्या हैं?

केवल एक पैरामीटर नहीं है, नियम है कि उस पैरामीटर के तीन व्यवहार्य पैरामीटर initializations में से एक दोनों अन्य दो की तुलना में बेहतर मैच होना चाहिए है। जब दो प्रारंभिकताओं की तुलना की जाती है, तो कोई भी दूसरे से बेहतर होता है, या न तो बेहतर होता है (वे अलग-अलग होते हैं)।

प्रत्यक्ष संदर्भ बाध्यकारी के बारे में विशेष नियमों के बिना, वर्णित सभी तीन प्रारंभिकता अलग-अलग (सभी तीन तुलनाओं में) होगी।

प्रत्यक्ष संदर्भ बाध्यकारी के बारे में विशेष नियम int&&const int& से बेहतर बनाते हैं, लेकिन int से बेहतर या खराब नहीं है।

S1 S2 
int int&&   indistinguishable 
int const int& indistinguishable 
int&& const int& S1 better 

int&& 13.3.3.2 की तुलना में बेहतर const int& वजह से है:: इसलिए वहाँ कोई सर्वश्रेष्ठ है

एस 1 और एस 2 संदर्भ बाइंडिंग (8.5.3) और न एक अंतर्निहित वस्तु पैरामीटर को संदर्भित करता हैं एक गैर-स्थैतिक सदस्य समारोह के बिना एक रेफ-क्वालीफायर के घोषित किया गया है, और एस 1 एक रैवल्यू के लिए एक रैल्यू संदर्भ को बांधता है और एस 2 एक अंतराल संदर्भ को बांधता है।

लेकिन यह नियम लागू नहीं होता है जब प्रारंभिक में से कोई एक संदर्भ बाध्यकारी नहीं है।

वहाँ कोई मौका पूर्णांक & & एक भविष्य मानक में पूर्णांक से अधिक पसंद किया जा सकता है? संदर्भ को प्रारंभकर्ता से बांधना चाहिए, जबकि ऑब्जेक्ट प्रकार इतना बाध्य नहीं है। इसलिए टी और टी & & के बीच अधिभार प्रभावी ढंग से हो सकता है "अगर मुझे स्वामित्व दिया गया है तो मौजूदा ऑब्जेक्ट का उपयोग करें, अन्यथा एक प्रति बनाएं।"

आप एक गैर संदर्भ तुलना में एक बेहतर मैच बाध्यकारी बाध्यकारी। क्यों isocpp future proposals करने के लिए अपने विचार पोस्ट नहीं एक संदर्भ बनाने के लिए प्रस्ताव करते हैं। अतः व्यक्तिपरक चर्चा/विचार के लिए सबसे अच्छा नहीं है।

+0

तो दोनों जीसीसी और क्लैंग सही हैं: यदि 'एफ (int)' और 'f (int &&) 'विचाराधीन हैं, तो अधिभार अस्पष्ट है, और' f (int) के लिए समान है 'और' एफ (int const &) ' – Yakk

+3

@Yakk: _" अगर एफ (int) और f (int &&) विचाराधीन हैं, अधिभार अस्पष्ट है "_ लगभग। यदि कोई सर्वश्रेष्ठ मैच नहीं है, तो अधिभार अस्पष्ट है। मान लीजिए 'एफ (int)', 'f (int &&)' और 'f (double)' 'f (2.0) 'के कॉल के लिए व्यवहार्य थे। 'एफ (डबल)' सर्वोत्तम मिलान है, भले ही 'एफ (int)' और 'f (int &&) 'विचाराधीन हैं। –

संबंधित मुद्दे