2017-12-14 93 views
7

महत्व देता कोड compiles successfully both with clang++ 5.0.0 and g++ 7.2 (-std=c++17 -Wall -Wextra -Werror -pedantic-errors -O0 संकलन झंडे के साथ) के बाद:समारोह मापदंडों और वापसी के रूप में अधूरा प्रकार

struct Foo; 

struct Bar 
{ 
    Foo get() const; 

    void set(Foo); 
}; 

struct Foo 
{ 
}; 

Foo Bar::get() const 
{ 
    return {}; 
} 

void Bar::set(Foo) 
{ 
} 


int main() 
{ 
    Bar bar{}; 

    (void)bar.get(); 
    bar.set(Foo{}); 
} 

यह समारोह पैरामीटर के रूप में अधूरा प्रकार का उपयोग करें और मूल्यों वापस जाने के लिए मान्य है? सी ++ इस पर क्या कहता है?

+0

यह मूल रूप से आप किसी भी शीर्षलेख में क्या करते हैं ... –

+0

@ Jaa-c यह मूर्खतापूर्ण लग सकता है लेकिन मैंने कभी भी मेरे शीर्षलेख फ़ाइलों में फ़ंक्शन रिटर्न प्रकार या पैरामीटर प्रकार के रूप में अपूर्ण प्रकारों का उपयोग नहीं किया है। – Constructor

+0

विचार यह है कि आप उन सभी को नहीं बनाते हैं, जो संभवतः परोक्ष रूप से, आपके हेडर को शामिल करते हैं * * को * इसके द्वारा उपयोग किए जाने वाले हर प्रकार की पूर्ण परिभाषाओं को पार्स करना पड़ता है, क्योंकि वे परिभाषाओं की आवश्यकता वाले कार्यों का उपयोग नहीं कर सकते हैं। और यदि वे * करते हैं, तो वे पूरी परिभाषा स्वयं शामिल कर सकते हैं। मुझे लगता है कि बहस जंगली और हमेशा के लिए गुस्से में है कि क्या आपके उपयोगकर्ताओं की अपेक्षा करना अच्छा है। आंतरिक रूप से उपयोग किए जाने वाले हेडर के लिए, मैं कहूंगा कि यह कोई ब्रेनर नहीं है। –

उत्तर

8

एक समारोह में परिभाषा, आप अधूरा प्रकार का उपयोग नहीं कर सकते हैं: [dcl.fct]/12:

एक पैरामीटर या एक समारोह परिभाषा के लिए वापसी प्रकार के प्रकार के एक अधूरी (संभवतः सीवी -qualified नहीं होगा) फ़ंक्शन परिभाषा के संदर्भ में वर्ग प्रकार जब तक कि फ़ंक्शन हटाया नहीं जाता है।

लेकिन एक समारोह घोषणा में ऐसा कोई प्रतिबंध नहीं है। जब तक आप Bar::get और Bar::set परिभाषित करते हैं, Foo एक पूर्ण प्रकार है, इसलिए प्रोग्राम ठीक है।

3

क्या यह कार्यात्मक पैरामीटर और वापसी मूल्यों के रूप में अपूर्ण प्रकारों का उपयोग करने के लिए मान्य है? सी ++ इस पर क्या कहता है?

फ़ंक्शन घोषणा में, हाँ यह मान्य है।

[basic.def.odr] ऐसी स्थितियों को सूचीबद्ध करता है जहां एक प्रकार पूरा होना चाहिए। उस सूची में फ़ंक्शन घोषणाओं का कोई उल्लेख नहीं है। ध्यान दें कि कार्य परिभाषाओं को T के लिए T के तर्क और वापसी प्रकारों के लिए परिभाषा की आवश्यकता है।

+0

हेडर में रिटर्न प्रकार 'टी' को परिभाषित न करना समस्याग्रस्त क्यों है? कॉलर को इसके लिए केवल '# शामिल' जोड़ना होगा, और उस छोटी सी असुविधा के बदले में आप सभी के लिए संकलन-समय निर्भरता को कम करते हैं, क्योंकि हर किसी को 'fun.h' की आवश्यकता नहीं है, वास्तव में फ़ंक्शन को कॉल कर सकता है, खासकर अगर हम एक सदस्य समारोह के बारे में बात कर रहे हैं। –

+0

@ क्रिस्टियन हैकल हाँ, वह मेरे बारे में थोड़ा मूर्ख था। – user2079303

0

जहाँ तक मुझे पता है, आप निम्न तरीकों से एक अधूरी प्रकार का उपयोग कर सकते हैं:

  1. संकेत के रूप में;
  2. संदर्भ के रूप में;

क्योंकि फ़ंक्शन की घोषणा किसी वस्तु को नहीं बनाती है, इसलिए यह कानूनी है।

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