फंक्शन हेडिंग में एरो ऑपरेटर (->)


128

मैं निम्नलिखित कोड भर आया:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

एक बात है जो मुझे समझ नहीं आ रही है:

मुझे पता चल गया कि ->फंक्शन हेडिंग में एरो ऑपरेटर ( ) का क्या मतलब है? मैं विशुद्ध रूप से तार्किक रूप से अनुमान लगाता हूं, कि ->ऑपरेटर एक प्रकार का निर्धारण करता है, जो autoकरने के लिए कटौती की जाएगी, लेकिन मैं इसे सीधे प्राप्त करना चाहता हूं। मुझे कोई जानकारी नहीं मिल रही है।


2
यह ट्रेलिंग रिटर्न टाइप सिंटैक्स का हिस्सा है। देखें stackoverflow.com/a/4113390/962089
क्रिस

2
यह एक ऑपरेटर नहीं है, लेकिन सिंटैक्स का एक हिस्सा है।
टेक्ससब्रूस

1
"मैं कहां पढ़ सकता हूं?" के जवाब में, सी ++ कल्पना सबसे आधिकारिक है। धन की कमी या $ $ खर्च करने की इच्छा, आखिरी काम का मसौदा अक्सर पर्याप्त और नो-कॉस्ट के करीब होता है। ये चश्मा अत्यधिक तकनीकी-भाषण हैं, इसलिए आईएसओ चश्मा पढ़ने के साथ परिचितता की कमी है, cplusplus.com या cppreference.com या अन्य ऐसी साइटें आज़माएं जो आधिकारिक नहीं हैं, लेकिन आमतौर पर बहुत सटीक हैं। नोट: अनुगामी रिटर्न प्रकार C ++ 14 के साथ शुरू किया जा सकता है।
लेस

जवाबों:


205

C ++ 11 में, फ़ंक्शन घोषणा के लिए दो सिंटैक्स हैं:

    रिटर्न-प्रकार पहचानकर्ता ( तर्क-घोषणाएँ ... )

तथा

    auto पहचानकर्ता ( तर्क-घोषणाएँ ... ) -> return_type

वे बराबर हैं। अब जब वे समान हैं, तो आप कभी भी उत्तरार्द्ध का उपयोग क्यों करना चाहते हैं? खैर, सी ++ 11 ने इस शांत decltypeचीज़ को पेश किया है जो आपको अभिव्यक्ति के प्रकार का वर्णन करने की अनुमति देता है। इसलिए आप तर्क प्रकारों से वापसी प्रकार प्राप्त करना चाहते हैं। तो आप कोशिश करें:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

और संकलक आपको बताएगा कि यह नहीं जानता कि तर्क में क्या हैं aऔर क्या bहैं decltype। ऐसा इसलिए है क्योंकि वे केवल तर्क सूची द्वारा घोषित किए जाते हैं।

आप आसानी से समस्या के आसपास काम कर सकते हैं declvalऔर पहले से ही घोषित किए गए टेम्पलेट पैरामीटर। पसंद:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

सिवाय इसके कि वास्तव में अभी क्रिया हो रही है। इसलिए वैकल्पिक घोषणा सिंटैक्स प्रस्तावित और कार्यान्वित किया गया था और अब आप लिख सकते हैं

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

और यह कम क्रिया है और स्कूपिंग नियमों को बदलने की आवश्यकता नहीं थी।


C ++ 14 अद्यतन: C ++ 14 भी केवल अनुमति देता है

    auto पहचानकर्ता ( तर्क-घोषणाएँ ... )

जब तक उपयोग करने से पहले फ़ंक्शन को पूरी तरह से परिभाषित किया जाता है और सभी returnकथन एक ही प्रकार के होते हैं। ->यदि आप स्रोत फ़ाइल में शरीर को छुपाना चाहते वाक्य रचना सार्वजनिक कार्यों (शीर्षक में घोषित) के लिए उपयोगी रहता है। कुछ हद तक स्पष्ट रूप से टेम्पलेट्स के साथ नहीं किया जा सकता है, लेकिन कुछ ठोस प्रकार हैं (आमतौर पर टेम्पलेट मेटाप्रोग्रामिंग के माध्यम से प्राप्त होते हैं) जो अन्यथा लिखना मुश्किल है।


2
बहुत अच्छा, स्वच्छ और ज्ञानवर्धक उत्तर @Jan Hudec। अंगूठे ऊपर। क्या इस तरह के फ़ंक्शन में भाग की आवश्यकता के बिना C++14मैं उपयोग के autoलिए कुछ बदल गया हूं । क्या यह अब तक बेमानी है या क्या इसके अन्य मामले हैं जहां इसे अभी भी इस्तेमाल किया जाना चाहिए? या यह एक संकलक विशिष्ट विस्तार है? return-> decltype(a + b)
शादि

1
@ शदी, सी ++ 14 में एन 3638 शामिल है , जो autoकि ->नोटेशन के बिना घोषित किए गए रिटर्न प्रकार को कम करने की अनुमति देता है, जब तक कि उपयोग से पहले फ़ंक्शन को पूरी तरह से परिभाषित किया गया हो और सभी returnस्टेटमेंट उसी प्रकार के लिए कटौती करते हैं । ->अंकन आप जबकि स्रोत फ़ाइल में शरीर छुपा सार्वजनिक समारोह के लिए कटौती उपयोग करना चाहते हैं अभी भी उपयोगी है।
Jan Hudec

23

सादे अंग्रेजी में यह बताता है कि वापसी प्रकार के योग का अनुमानित प्रकार है aऔर b

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.