2013-02-03 12 views
10

क्या निम्नलिखित कोड C++ में कानूनी है?फ़ंक्शन का एक अनाम पैरामीटर डिफ़ॉल्ट मान हो सकता है?

void f(void* = 0) 
{} 

int main() 
{ 
    f(); 
} 

सी ++ मानक का कौन सा पृष्ठ बताता है कि यह उपयोग कानूनी है?

+0

हालांकि यह है, मैं क्या काल्पनिक स्थिति में को समझ नहीं सकता इस तरह के एक सुविधा वास्तव में किसी भी उपयोग हो सकता था ... –

+3

@MatteoItalia 'enable_if' आमतौर पर। – Pubby

+0

@MatteoItalia: SFINAE –

उत्तर

11

हाँ, यह कानूनी है।

विशेषताओं के इस संयोजन को विशेष रूप से अनुमति देने के लिए कोई मानक शब्द नहीं है; वहां को को अस्वीकार करने के लिए कोई भी नहीं है।

[C++11: 8.3.6/1]:एक प्रारंभकर्ता-खंड एक पैरामीटर-घोषणा इस प्रारंभकर्ता-खंड में निर्दिष्ट किया जाता है तो है:

डिफ़ॉल्ट तर्क वाक्य रचना एक पैरामीटर-घोषणा में पैरामीटर कार्य करने के लिए लागू होता है एक डिफ़ॉल्ट तर्क के रूप में प्रयोग किया जाता है। कॉल में डिफ़ॉल्ट तर्क का उपयोग किया जाएगा जहां पीछे तर्क तर्क गुम हैं। एक पैरामीटर-घोषणा में

... और समारोह मापदंडों अनाम हो सकता है:

[C++11: 8.3.5/11]:[..] एक पहचान फाई एर वैकल्पिक एक पैरामीटर नाम के रूप में प्रदान की जा सकती। [..]

8.3.6/4 के तहत इस उपयोग के भी एक उदाहरण है (हालांकि उदाहरण प्रामाणिक पाठ नहीं कर रहे हैं, तो यह वस्तुतः कुछ भी साबित करने के लिए इस्तेमाल नहीं किया जा सकता है)।

11

हां, यह पूरी तरह से कानूनी है। एक स्पष्ट उदाहरण N3485 में पाया जाता है 8.3.6 डिफ़ॉल्ट तर्क/4:

[उदाहरण: घोषणा

void point(int = 3, int = 4); 

एक समारोह है कि शून्य, एक या दो तर्क के साथ कहा जा सकता है की घोषणा की प्रकार int।

+2

उदाहरण मानक नहीं हैं;) –

+0

@ लाइटनेसरेसेसिन ऑर्बिट, मैं देख रहा हूं :) ऐसा नहीं है कि यह स्पष्ट रूप से कहता है "डिफ़ॉल्ट तर्कों का नाम बदला जा सकता है।" मुझे लगता है कि यह आधार के आधार पर बंद हो जाता है कि यह गैर-डिफ़ॉल्ट पैरामीटर वाले गुण साझा करता है। – chris

+0

ठीक है, मुझे एक भ्रमित सबूत स्थापित हुआ है, लेकिन लाइट ने इसका बेहतर काम किया है, इसलिए बाद में आने वाले लोगों को भ्रमित करने की कोशिश करने योग्य नहीं है :) – chris

1

हां, यह कानूनी है।
खंड 8.3.5/1 में फ़ंक्शन पैरामीटर के लिए दिए गए वाक्यविन्यास प्रस्तुतियां पहचानकर्ता के बिना पैरामीटर घोषणा की अनुमति देती हैं, लेकिन असाइनमेंट अभिव्यक्ति (प्रारंभकर्ता के रूप में) के साथ।

-1

न केवल यह कानूनी है, यह वास्तव में आपकी कोडिंग शैली के आधार पर काफी उपयोगी हो सकता है।

डिफ़ॉल्ट पैरामीटर फ़ंक्शन घोषणा में केवल सार्थक हैं।

नामित पैरामीटर फ़ंक्शन परिभाषा में केवल सार्थक हैं।

एफ।ज:

void f(void*=nullptr); 

f.cc

void f(void* x) 
{ 
... 
} 
+2

_ "नामित पैरामीटर फ़ंक्शन परिभाषा में केवल सार्थक हैं।" _ Lolwut .. मैं समझता हूं कि आप यहां क्या कहने की कोशिश कर रहे हैं लेकिन मुझे यह कुछ हद तक लुभावना लगता है। –

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