2016-07-27 4 views
18

मैंने कभी भी [[ noreturn ]] को गैर-शून्य वापसी कार्यों पर उपयोग नहीं किया है।क्या मैं गैर-शून्य वापसी कार्यों पर [[noreturn]] का उपयोग कर सकता हूं?

निम्नलिखित अच्छी तरह से परिभाषित किया गया है?

[[ noreturn ]] int function(); 

int function(){ 
    while(true){/* impl */} 
    return 0; 
} 

कारण वापसी प्रकार int होना चाहिए, समारोह एक समारोह सूचक के माध्यम से एक और कार्य करने के लिए पारित कर दिया है, क्योंकि है।

तो यह सोचते हैं फोन करने वाले इस तरह दिखता है:

//call the non-returning function 
int var = (*fptr)(); 

//use var some way (even though the function will never actually return) 
std::cout << var; 

इस प्रदर्शनी अपरिभाषित व्यवहार के किसी भी प्रकार करेंगे?

+3

आप कार्यान्वयन के भत्ते के साथ पैडेंटिक परेशानी में भाग ले सकते हैं यह मानने के लिए कि एक अनंत लूप समाप्त होता है। ([लिंक] (http://blog.regehr.org/archives/161)) – chris

+0

@ क्रिसिस मैं वापसी मूल्य को [[शायद_unused]] के साथ टैग करने की उम्मीद कर रहा हूं। –

+4

आपके द्वारा पोस्ट किए गए लिंक से: * व्यवहार को अनिर्धारित किया गया है यदि इस विशेषता के साथ फ़ंक्शन वास्तव में लौटाता है। * – 101010

उत्तर

23

[[noreturn]] पर मानक विनिर्देश [dcl.attr.noreturn] में है। पूरे प्रामाणिक ग्रंथों में लिखा है:

विशेषता-टोकनnoreturn निर्दिष्ट करता है कि एक समारोह वापस नहीं करता है। यह में प्रत्येक बार विशेषता-सूची और विशेषता-तर्क-खंड मौजूद होगा। विशेषता को पर घोषणाकर्ता-आईडी पर फ़ंक्शन घोषणा में लागू किया जा सकता है। फ़ंक्शन की पहली घोषणा noreturn विशेषता निर्दिष्ट करेगी यदि उस फ़ंक्शन की कोई घोषणा noreturn विशेषता निर्दिष्ट करती है। यदि एक फ़ंक्शन को noreturn एक अनुवाद इकाई में विशेषता के साथ घोषित किया गया है और उसी फ़ंक्शन को noreturn किसी अन्य अनुवाद इकाई में विशेषता के बिना घोषित किया गया है, तो कार्यक्रम खराब हो गया है; कोई निदान की आवश्यकता नहीं है।

तो एक समारोह f जहां f पहले noreturn विशेषता के साथ घोषित किया गया था और f अंततः रिटर्न कहा जाता है, व्यवहार अनिर्धारित रहता है।

प्रकार का कोई उल्लेख नहीं है। एकमात्र चीज जो मायने रखती है वह यह है कि फ़ंक्शन वापस नहीं आता है। यदि फ़ंक्शन लौटाता है (चाहे void या int या vector<vector<double>>), तो व्यवहार अपरिभाषित है। अगर समारोह वापस नहीं आता है, तो वापसी का प्रकार असीमित है।

10

सी ++ मानक से §7.6.8/p2 Noreturn विशेषता [dcl.attr.noreturn] (जोर मेरा):

तो एक समारोह च जहां च पहले से घोषित किया गया था कहा जाता है noreturn विशेषता और अंततः रिटर्न के साथ, व्यवहार अपरिभाषित है। [नोट: फ़ंक्शन अपवाद फेंक कर समाप्त हो सकता है। - अंत नोट] [नोट: कार्यान्वयन को को चेतावनी दी जाती है यदि एक फ़ंक्शन चिह्नित [[noreturn]] वापस लौटा सकता है। - अंत टिप्पणी]

के बाद से अपने कार्य return 0; तक पहुँचने कभी नहीं होगा कोई यूबी है।

+5

यह प्रश्न का उत्तर कैसे देता है? ओपी जानता है कि इसे वापस नहीं करना चाहिए, वह इसके प्रकार के बारे में पूछ रहा है। –

+0

मानक उद्धरण कैसे स्पष्ट करता है कि यह * ub है? ओपी का काम अंततः वापस नहीं आता है। – Barry

+0

@ बैरी क्या यह '0' वापस नहीं आता है? – 101010

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