2010-11-18 15 views
5

के साथ एक फ़ंक्शन को परिभाषित करना आज मैंने पाया कि एक हस्ताक्षर के साथ एक शीर्षलेख में एक फ़ंक्शन घोषित करना संभव है, और इसे अलग-अलग (समान) हस्ताक्षर के साथ स्रोत फ़ाइल में कार्यान्वित करना संभव है। उदाहरण के लिए, इस तरह:विभिन्न हस्ताक्षर

// THE HEADER example.hpp 

#ifndef EXAMPLE_HPP 
#define EXAMPLE_HPP 

int foo(const int v); 

#endif 

// THE SOURCE FILE example.cpp 

#include "example.hpp" 

int foo(int v) // missing const 
{ 
    return ++v; 
} 

क्या यह अनुमति है? या यह संकलक का विस्तार है (मैं जी ++ 4.3.0 का उपयोग कर रहा हूँ)?

संपादित मैं पंडिताऊ और अधिकतम संभव चेतावनी स्तर के साथ संकलन कर रहा हूँ, और मैं अभी भी एक चेतावनी या एक त्रुटि नहीं मिल रहा है।

+0

क्या आपने पढ़ा मानक? "शीर्ष स्तरीय कॉन्स क्वालीफायर" के लिए – Abyx

उत्तर

12

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

शीर्ष स्तर const फ़ंक्शन के बॉडी को प्रभावित करता है। यह निर्धारित करता है कि फ़ंक्शन के शरीर में पैरामीटर बदला जा सकता है या नहीं। यद्यपि घोषणा के रूप में यह वही कार्य है।

तो हाँ, यह कानूनी है और घोषणा और परिभाषा एक ही कार्य को संदर्भित करती है, न कि अधिभार।

स्टैंडर्ड संदर्भ: 8.3.5 [dcl.fct]/3:। "[...] एक समारोह के प्रकार के निम्नलिखित नियमों का उपयोग कर निर्धारित किया जाता है [...] किसी भी सीवी-क्वालीफायर एक पैरामीटर को संशोधित प्रकार हटा दिया गया है। [...] सीवी-क्वालीफायर फ़ंक्शन के शरीर के भीतर पैरामीटर की परिभाषा को प्रभावित करता है; वे फ़ंक्शन प्रकार को प्रभावित नहीं करते हैं। [...] "

+0

+1। आप उससे स्पष्ट नहीं हो सकते हैं। –

+0

ग्रेट। यह अनुच्छेद भी मेरे प्रश्न का उत्तर देता है। –

5

int एक मूल मूल्य प्रकार है, कॉन्स्ट संशोधक का कोई प्रभाव नहीं पड़ता है। इससे कोई फर्क नहीं पड़ता कि आप फ़ंक्शन में अपने int के साथ क्या करते हैं, यह कॉलर द्वारा कभी नहीं देखा जाएगा।

आप int & के साथ ऐसा नहीं कर सकते हैं। उस स्थिति में, कॉलर के लिए उपस्थिति या अनुपस्थिति वास्तव में कॉलर के लिए प्रासंगिक है, क्योंकि को संदर्भित int को संशोधित किया जा सकता है।

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