मूल्य से लौटने की आवश्यकता प्रकार की परिभाषा की आवश्यकता नहीं है। एक आगे की घोषणा पर्याप्त है
मूल्य द्वारा लौटाए गए फ़ंक्शन को अस्वीकार करने के लिए प्रकार परिभाषा की आवश्यकता नहीं है। एक अच्छी तरह से गठित डेमो:
struct S;
S foo();
struct S {};
int main() {
foo();
}
S foo() {}
मूल्य द्वारा लौटाए गए फ़ंक्शन को परिभाषित या कॉल करने के लिए टाइप परिभाषा की आवश्यकता होती है। स्टैंडर्ड मसौदा [basic.def.odr]:
5 वास्तव में एक वर्ग की एक परिभाषा एक अनुवाद इकाई में आवश्यक है अगर वर्ग एक तरीका है कि वर्ग प्रकार की आवश्यकता है पूरा करने के लिए प्रयोग किया जाता है। [उदाहरण: ... [स्निप] ... [नोट: घोषणाओं और अभिव्यक्तियों के नियमों का वर्णन करता है जिसमें पूर्ण वर्ग प्रकारों के संदर्भों की आवश्यकता होती है। एक वर्ग प्रकार टी होना चाहिए पूरा यदि:
- [स्निप]
- 5.9 एक वापसी प्रकार या प्रकार टी का तर्क प्रकार के साथ एक समारोह परिभाषित किया गया है ([basic.def]) या कहा जाता है ([expr .call]), या
- [स्निप]
अधूरा वापसी प्रकार के साथ एक समारोह की घोषणा परोक्ष सूची में से कोई भी नियम से मना नहीं किया जा रहा के आधार पर अनुमति दी है।
नियम मानक में बाद में फिर से शब्दों में है, और यह एक अपवाद द्वारा छूट दी है [dcl.fct] (धन्यवाद इस नियम ओर इशारा करते हुए के लिए @cpplearner के लिए):
11 प्रकार वापसी में परिभाषित नहीं किया जाएगा या पैरामीटर प्रकार। फ़ंक्शन परिभाषा के लिए पैरामीटर या रिटर्न प्रकार का प्रकार फ़ंक्शन परिभाषा के संदर्भ में अधूरा (संभवतः सीवी-योग्य) वर्ग प्रकार नहीं होगा जब तक कि फ़ंक्शन हटाया नहीं जाता है ([dcl.fct.def.delete])।
एक बीमार गठन डेमो:
struct S;
S foo(){} // oops
struct S {};
एक और बीमार का गठन डेमो:
struct S;
S foo();
int main() {
foo(); // oops
}
struct S {};
S foo() {}
आप, स्पष्ट आप क्या सोचते नहीं कानूनी है हो सकता है वास्तव में? जैसे, एक वास्तविक कोड नमूना आपको लगता है कि अवैध है? – Yakk
यह फ़ंक्शन घोषणाओं पर लागू होता है, परिभाषाएं नहीं। और नहीं, यह मानक से उद्धरण नहीं है। – juanchopanza
शायद मुझे यह कहना चाहिए था कि "मूल्य से लौटने की आवश्यकता नहीं है ** जब आप फ़ंक्शन घोषित करते हैं ** ** आगे की घोषणा पर्याप्त है।" जब आप फ़ंक्शन को परिभाषित करते हैं और जब आप इसे कॉल करते हैं तो आपको परिभाषा की आवश्यकता होती है। –