2011-07-08 18 views
9

बढ़ावा :: समारोह FAQ item 3 विशेष रूप से परिदृश्य मैं में दिलचस्पी पते:क्या tr1 :: फ़ंक्शन वापसी मान निगल सकता है?

वहाँ क्यों कर रहे हैं शून्य रिटर्न के लिए वर्कअराउंड? सी ++ उन्हें अनुमति देता है! शून्य रिटर्न इस कोड स्निपेट में के रूप में, सी ++ मानक द्वारा अनुमति दी जाती है:

void f(); 
void g() { return f(); } 

यह बढ़ावा :: समारोह का एक मान्य उपयोग है, क्योंकि शून्य रिटर्न उपयोग नहीं किया जाता। शून्य रिटर्न के साथ, हम संकलित करने के लिए बीमार का गठन कोड के लिए इसी तरह का प्रयास कर रहा होगा:

int f(); 
void g() { return f(); } 

संक्षेप में, शून्य रिटर्न का उपयोग नहीं कर बढ़ावा :: समारोह एक वापसी मान निगल करने के लिए अनुमति देता है। यह के साथ संगत है जो उपयोगकर्ता को फ़ंक्शन और फ़ंक्शन ऑब्जेक्ट्स पैरामीटर के साथ असाइन करने की अनुमति देता है जो बिल्कुल मेल नहीं खाते हैं।

दुर्भाग्य से, यह VS2008 में काम नहीं करता:

c:\Program Files\Microsoft Visual Studio 9.0\VC\include\xxcallfun(7) : error C2562: 'std::tr1::_Callable_fun<_Ty>::_ApplyX' : 'void' function returning a value 

इस VS2008 TR1 कार्यान्वयन का गिरता हुआ है:

int Foo(); 
std::tr1::function<void()> Bar = Foo; 

इस के साथ शुरू त्रुटियों उत्पादन होता है? क्या यह वीएस -2010 में काम करता है? क्या टीआर 1 इस क्षमता को संबोधित करता है? सी ++ 0x के बारे में कैसे?

+0

वीएस -2010 एक ही त्रुटि देता है। – Xeo

+2

'शून्य जी() {वापसी एफ(); } को टेम्पलेट कोड का समर्थन करने की अनुमति है जहां फ़ंक्शन का रिटर्न प्रकार अग्रिम में ज्ञात नहीं हो सकता है ... यह अभी भी 'f()' के लिए एक त्रुटि है यदि वास्तव में 'g()' नहीं है। यह देखते हुए, मुझे यह जानकर आश्चर्य नहीं होगा कि मानक समिति इस संबंध में बूस्ट के कार्यान्वयन से अलग हो गई है, क्योंकि यह एक अधिक सहज व्यवहार प्रदान करती है। लेकिन चूंकि gcc * करता है * इस व्यवहार की अनुमति देता है, मैं सकारात्मक नहीं हूं। –

उत्तर

8

मेरा मानना ​​है कि tr1 इस मुद्दे को संबोधित करता है। N1836 (नवीनतम tr1 मसौदा) का कहना है:

एक समारोह ऑब्जेक्ट प्रकार एफ के च तर्क प्रकारों T1, T2, ..., तमिलनाडु और एक वापसी प्रकार आर, अगर, यह देखते हुए lvalues ​​t1 के लिए प्रतिदेय है , टी 2, ..., tNoftypesT1, टी 2, ..., टीएन, क्रमशः, INVOKE (एफ, टी 1, टी 2, ..., टीएन) अच्छी तरह से गठित ([3.3]) है, और यदि आर है शून्य नहीं, आर

के लिए परिवर्तनीय अपने उदाहरण में आर शून्य है, और इसलिए Callable (आर के लिए परिवर्तनीय) के लिए आवश्यकताओं के अंतिम भाग की उपेक्षा है घ।

हालांकि ऐसा लगता है कि सी ++ 0x (सी ++ 11) नियमों को बदलता है। सी ++ 11 Callable को INVOKE(f, t1, t2, ..., tN, R) के रूप में परिभाषित किया गया है जिसे [func.require] में परिभाषित किया गया है क्योंकि INVOKE(f, t1, t2, ..., tN) को आर में शून्य रूप से परिवर्तनीय होने के लिए आर के शून्य होने के लिए कोई अपवाद नहीं है। तो सी ++ 11 में, आपका उदाहरण असफल होना चाहिए।

+2

क्या आप जानते हैं कि इस परिवर्तन/प्रतिगमन के लिए कोई तर्क है या नहीं? यदि नहीं, तो यह एक दोष की तरह लगता है। –

+0

यह वास्तव में अजीब लगता है। कोई अभिव्यक्ति स्पष्ट रूप से 'शून्य' में परिवर्तनीय नहीं है।प्रकार 'शून्य' की अभिव्यक्ति भी नहीं है (खंड 4 अनुच्छेद 3 के अनुसार)। चीज़ों को 'शून्य' में बदलने के लिए किसी को एक स्पष्ट कलाकार की आवश्यकता होती है। मुझे लगता है कि इरादा यह है कि केवल तभी परिणाम 'आर' से अलग है, तो अभिव्यक्ति को पूरी तरह से 'आर' में परिवर्तित कर दिया गया है। फिर परिणाम 'शून्य' टाइप हो सकता है जब 'आर' 'शून्य' होता है। हालांकि, उन अनुच्छेदों द्वारा धोखा देना आसान है, आईएमओ :) –

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