यह सी ++ 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)
के लिए घोषित करने की आवश्यकता है, इसलिए आपको नए वाक्यविन्यास की आवश्यकता है।
वैसे, गुगलिंग के लिए, शब्द "पिछला वापसी प्रकार" है। – chris