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