2012-09-14 17 views
30

एक प्रणाली हेडर फाइल में, मैं इस तरह अभिव्यक्ति देखें: "->"फ़ंक्शन घोषणा के बाद "->" क्या है?

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type> 
{...} 

मैं नहीं जानता कि क्या है, यह अभिव्यक्ति या लैम्ब्डा अभिव्यक्ति सूचक नहीं है इसका मतलब है, किसी को भी मेरी मदद कर सकते?

+4

वैसे, गुगलिंग के लिए, शब्द "पिछला वापसी प्रकार" है। – chris

उत्तर

47

यह सी ++ 11 से नया फ़ंक्शन घोषणा वाक्यविन्यास है, और इसे "पिछला रिटर्न प्रकार" कहा जाता है। फ़ंक्शन घोषणा के अंत में, -> का अर्थ है कि फ़ंक्शन का रिटर्न प्रकार निम्न है। इसका उपयोग केवल तब किया जा सकता है जब auto कीवर्ड का उपयोग वास्तविक रिटर्न प्रकार के बजाय किया जाता है जहां आप आमतौर पर इसकी अपेक्षा करेंगे।

उदाहरण के लिए, इन दोनों घोषणाओं संगत कर रहे हैं:

:

int foo(); 
auto foo() -> int; 

अपने स्वाद पर निर्भर करता है, तो आप इसे वर्ष घोषणा सिंटेक्स की तुलना में खूबसूरत है, खासकर जब वापसी प्रकार बहुत देर तक/जटिल है मिल सकता है,

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param); 
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>; 

लेकिन कभी-कभी यह टेम्पलेट्स के साथ आवश्यक हो सकता है, जब फ़ंक्शन का रिटर्न प्रकार तर्कों के साथ भिन्न हो सकता है।

आप एक टेम्प्लेटेड समारोह चर जोड़ना चाहते हैं कहते हैं:

template<typename T> 
T add(const T& x, const T& y) 
{ 
    return x + y; 
} 

बहुत बढ़िया, लेकिन आप केवल एक ही प्रकार के चर जोड़ने के लिए सक्षम हो जाएगा। मान लीजिए कि आप किसी भी प्रकार के चर (जैसे add((int)1, (double)2)) जोड़ना चाहते हैं।

template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x + y; 
} 

समस्या यह है कि आप पहले से नहीं बता सकता कि x + y का परिणाम प्रकार हो जाएगा। चूंकि टेम्पलेट खड़े होते हैं, वे गैर-अभिन्न प्रकार भी हो सकते हैं। (क्या आप add(std::string("x"), "y") करने में सक्षम नहीं होना चाहते हैं?)

Decltype, नए फ़ंक्शन घोषणा वाक्यविन्यास के साथ, आपको इस समस्या को हल करने देता है।

template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x + y) 
{ 
    return x + y; 
} 

Decltype अभिव्यक्ति के प्रकार "रिटर्न"। चूंकि आपको और y की आवश्यकता के लिए decltype(x + y) के लिए घोषित करने की आवश्यकता है, इसलिए आपको नए वाक्यविन्यास की आवश्यकता है।

+0

आपके पास नियमित रिटर्न प्रकार के साथ भी तर्क प्रकारों तक पहुंच है, क्योंकि टेम्पलेट पैरामीटर हमेशा पहले घोषित किए जाते हैं। आपके पास पहुंच नहीं है पैरामीटर नाम, या यहां तक ​​कि फ़ंक्शन का नाम भी है। –

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