एक अच्छा कारण हो सकता है कि
void foo(bar, xyzzy = 0);
भार के की एक जोड़ी के समान है। जब एक के रूप में लिखा अभी भी एक में दो कार्यों, जिनमें से न तो "पसंदीदा" है किसी भी अर्थ में तरह
void foo(bar b) { /* something other than foo(b, 0); */ }
foo(bar, xyzzy);
भी, यह है:
void foo(bar b) { foo(b, 0); }
foo(bar, xyzzy);
इसके अलावा, कभी कभी यह फायदेमंद ऐसे में यह refactor करने के लिए है । आप एक-तर्क फ़ंक्शन को कॉल कर रहे हैं; दो तर्क एक प्रभावशाली ढंग से एक अलग कार्य है। डिफ़ॉल्ट तर्क नोटेशन सिर्फ उन्हें एक में विलीन करता है।
यदि ओवरलोडिंग उस व्यवहार के लिए होती है जिसे आप पूछ रहे हैं, तो स्थिरता के लिए इसे उस मामले में काम करना होगा जब टेम्पलेट दो परिभाषाओं में विभाजित हो। इससे कोई फर्क नहीं पड़ता क्योंकि कटौती एक असंबंधित कार्य से प्रकार खींच रही है जिसे बुलाया नहीं जा रहा है! और यदि इसे कार्यान्वित नहीं किया गया था, तो इसका अर्थ यह होगा कि विभिन्न पैरामीटर सूची की लंबाई को ओवरलोड करना "डिफ़ॉल्ट-तर्क" की तुलना में "द्वितीय श्रेणी नागरिक" बन जाता है।
यह अच्छा है अगर ओवरलोड और डिफॉल्टिंग के बीच का अंतर क्लाइंट को पूरी तरह छुपाया जाता है।
कह रहे हैं "क्योंकि मानक कहता है" एक वैध उत्तर है, इसके पीछे तर्क जानना अच्छा लगेगा। –
अन्य कारणों से, फ़ंक्शन की अलग-अलग घोषणाएं अलग-अलग डिफ़ॉल्ट तर्क घोषित कर सकती हैं (मैं निश्चित रूप से फ़ंक्शन टेम्पलेट्स पर लागू होता हूं।) –
@ जेम्स: नहीं, अलग-अलग घोषणाओं को विभिन्न डिफ़ॉल्ट तर्क घोषित करने की अनुमति नहीं है। यह एक ही तर्क के लिए एक ही डिफ़ॉल्ट देने के लिए कई घोषणाओं के लिए भी अनुमति नहीं है। 8.3.6 कहता है "बाद में घोषणा (एक ही मूल्य तक नहीं) द्वारा एक डिफ़ॉल्ट तर्क को फिर से नहीं किया जाएगा।" बेशक, यह केवल गैर-टेम्पलेट कार्यों पर लागू होता है। टेम्पलेट फ़ंक्शंस के लिए, ऐसा लगता है कि डिफ़ॉल्ट तर्क केवल आरंभिक घोषणा पर ही प्रदान किए जा सकते हैं। –