5

संदिग्ध डिफ़ॉल्ट पैरामीटर आने पर सी ++ कंपाइलर क्या करता है? उदाहरण के लिए, मान लीजिए कि एक समारोह था जैसे:संदिग्ध डिफ़ॉल्ट पैरामीटर आने पर C++ कंपाइलर क्या करता है?

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1, int c = 0); 

क्या उपर्युक्त अस्पष्ट माना जाता है? यदि नहीं, तो function1(10) जैसे कुछ कॉल करते समय संकलक क्या करता है (फ़ंक्शन वास्तव में कैसे मिलान किया जाता है)?

धन्यवाद!

+3

आपके कार्यों में अलग-अलग पहचानकर्ता हैं। कोई अस्पष्टता नहीं है। क्या आप उन्हें 'फ़ंक्शन' दोनों नाम देने का मतलब रखते थे? – JoshD

+0

@ जोश डी: असंभव। पहले में 2 पैरामीटर हैं, दूसरा - 3. – AnT

+1

@ एंड्रे: प्रश्न तब तक कोई समझ नहीं आता जब तक कि * अस्पष्टता न हो, इसलिए जोश की टिप्पणी apropos है। – dmckee

उत्तर

8

निम्नलिखित ठीक

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1, int c = 0); 

है और निम्नलिखित भी

function(); // calls first function 

ठीक है लेकिन निम्नलिखित अस्पष्ट

function(1); // second and first match equally well 

अधिभार संकल्प (प्रक्रिया है कि क्या कहता है के लिए है कॉल करने के लिए फ़ंक्शन), पैरामीटर जो स्पष्ट तर्क पारित नहीं किए हैं और जो defau का उपयोग करते हैं लेफ्टिनेंट तर्कों को नजरअंदाज कर दिया जाता है। तो कंपाइलर वास्तव में उपरोक्त कॉल के लिए एक int पैरामीटर रखने वाले दो कार्यों को देखता है और निर्णय नहीं ले सकता है।

निम्नलिखित हालांकि

void function(int a = 0, float b = 3.1); 
void function(int a, float b =1.1); 

जबकि अपने प्रश्न में कोड के लिए आप दो कार्यों की घोषणा (क्योंकि दोनों घोषणाओं मानकों के विभिन्न संख्या है), इस उदाहरण में आप केवल एक घोषित बीमार का गठन है फ़ंक्शन। लेकिन इसकी दूसरी घोषणा पैरामीटर के लिए एक डिफ़ॉल्ट तर्क दोहराती है (और यहां तक ​​कि एक अलग मूल्य के साथ, लेकिन इससे कोई फर्क नहीं पड़ता)। इसकी अनुमति नहीं है। ध्यान दें कि निम्नलिखित ठीक

void function(int a, float b = 3.1); 
void function(int a = 0, float b); 

डिफ़ॉल्ट तर्कों के सेट है कि एक ही समारोह के लिए एक ही दायरे में दिखाई विलय कर रहे हैं, और केवल कि एक ही दायरे में दिखाई देते हैं उन लोगों के लिए घोषणाओं के लिए है। तो निम्नलिखित मान्य

void function(int a = 0, float b = 3.1); 
void function1() { 
    void function(int a, float b = 1.1); 
    function(0); 
} 

है यह b के लिए पारित किया 1.1 साथ समारोह कहता है।

+1

यह शून्य कार्य है (int a = 0, float b); वास्तव में ठीक? क्या आपको यकीन है? – Max

1

यदि उनके पास अलग-अलग नाम हैं (जैसा कि आपके उदाहरण में है), कोई अस्पष्टता नहीं है। अगर उनके पास एक ही नाम है (इसलिए यह अधिभार पर एक प्रयास है), संकलक शिकायत करेगा।

हालांकि यह पता चला है कि आप किसी भिन्न स्कोप में किसी फ़ंक्शन में डिफ़ॉल्ट तर्क को फिर से परिभाषित कर सकते हैं (यह मेरे लिए खबर है ...) - लेकिन उसी दायरे में, आप डिफ़ॉल्ट तर्क को भी परिभाषित नहीं कर सकते मूल्य। 8.3.6/4 "डिफ़ॉल्ट तर्क" से:

गैर टेम्पलेट कार्यों के लिए, डिफ़ॉल्ट तर्क एक ही दायरे में एक समारोह के बाद के घोषणाओं में जोड़ा जा सकता है। विभिन्न स्कॉप्स में घोषणाएं डिफ़ॉल्ट तर्कों के पूरी तरह अलग सेट हैं। यही है, आंतरिक क्षेत्रों में घोषणाएं बाहरी स्कोप में घोषणाओं से डिफ़ॉल्ट तर्क प्राप्त करते हैं, और उपाध्यक्ष बनाम। किसी दिए गए फ़ंक्शन घोषणा में, सभी पैरामीटर को डिफ़ॉल्ट तर्क के पैरामीटर पर बाद में इस तर्क में प्रदान किए गए डिफ़ॉल्ट तर्क होंगे। डिफ़ॉल्ट तर्क बाद की घोषणा द्वारा पुन: परिभाषित नहीं किया जाएगा ( भी उसी मान पर नहीं)।

0

संदिग्ध? आपके पास दो पूरी तरह स्वतंत्र स्वतंत्र कार्य हैं: function1 और function2। यहां तक ​​कि प्रत्येक समारोह में पैरामीटर की संख्या अलग है। यहां कोई अस्पष्टता नहीं है। जब आप function1(10) पर कॉल करने के लिए कंपाइलर से पूछते हैं तो यह function1(10, 3.1) पर कॉल करता है। function2 तस्वीर में भी नहीं आया है।

यदि यह वही कार्य था, तो अस्पष्टता का मुद्दा केवल इसलिए नहीं उठता क्योंकि सी ++ में एक ही पैरामीटर के लिए एक बार डिफ़ॉल्ट (एक ही अनुवाद इकाई के भीतर) डिफ़ॉल्ट तर्क निर्दिष्ट करने के लिए अवैध है। आप में से भी दूसरी बार निर्दिष्ट ही डिफ़ॉल्ट तर्क मूल्य, कार्यक्रम बीमार बनाई है

void foo(int a = 5); 
void foo(int a = 5); // <- ERROR 

क्या एक यद्यपि कर सकते हैं अलग अनुवाद में एक ही समारोह के लिए डिफ़ॉल्ट तर्क का एक अलग सेट निर्दिष्ट करने के लिए है इकाइयों। लेकिन यह कोई अस्पष्टता नहीं बनाता है क्योंकि संकलक केवल एक अनुवाद इकाई देख सकता है। संकलक बस उस मामले में किसी भी संभावित "अस्पष्टता" के बारे में कभी नहीं जानता होगा।

+0

क्या होगा यदि यह एक ही फ़ंक्शन नाम के साथ दो अलग-अलग फ़ंक्शन थे? मुझे लगता है कि ओपी वास्तव में क्या मतलब है। –

-1

इसके अलावा, "सी ++ कंपाइलर क्या करता है ..." के साथ शुरू होने वाले किसी भी प्रश्न का उत्तर हमेशा होता है, "इस पर निर्भर करता है कि आप किस कंपाइलर के बारे में बात कर रहे हैं।"

+0

ठीक है, मान लीजिए कि यह जीएनयू कंपाइलर था। – laluser

+0

कौन सा संस्करण? .... filler अक्षर ... –

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