2012-10-31 11 views
6

संभव डुप्लिकेट:
What is “->” after function declaration?उपयोग - समारोह घोषणा में>

मैं सिर्फ सी ++ नई auto कीवर्ड का उपयोग कार्यों का निम्न उदाहरण का सामना करना पड़ा है, और मुझे उम्मीद थी कोई मुझे समझने में मदद कर सकता है कि वाक्यविन्यास का क्या अर्थ है।

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

auto f = [](int a, int b) -> int { 
    return a*b; 
}; 

विशेष रूप से, मैं समारोह हस्ताक्षर में -> के उपयोगकर्ता लेकर संदेह में हूँ और मैं उम्मीद होती है इन के रूप में

template <class T, class U> 
auto add(T t, U u) 
{ 
    decltype(t + u); 
} 

auto f = [](int a, int b){ 
    return a*b; 
}; 

में लिखे जाने की क्या है -> ऑपरेटर वहाँ में कर रही है, और जहां क्या मैं इस वाक्यविन्यास के बारे में और जान सकता हूं?

template <class T, class U> 
    decltype(t + u) add(T t, U u) { ... } 

... सी में सही नहीं होगा ++:

उत्तर

13

-> ऑपरेटर क्या कर रहा है?

यह पिछला रिटर्न प्रकार है। बजाय:

int f(); 

आप समतुल्य रूप लिख सकते हैं:

auto f() -> int; 

वापसी प्रकार समारोह पैरामीटर प्रकार पर निर्भर करता है, तो आप इस प्रपत्र का उपयोग करने की जरूरत है; इसके अलावा, अगर आप हैं, तो आप इस प्रपत्र का उपयोग करना चाहिए एक लैम्ब्डा की वापसी प्रकार निर्दिष्ट करना चाहते हैं

decltype(t+u) add(T t, U u); // Error: uses `t` and `u` before they're declared 
auto add(T t, U u) -> decltype(t + u); // OK 

;: पैरामीटर नहीं उपलब्ध होने के बाद वे घोषित किया गया है कर रहे हैं हालांकि, जैसा कि आप इंगित करते हैं, कई मामलों में (इस सहित) आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है।

2

इस वाक्य रचना (ताकि अनुगामी-रिटर्न प्रकार कहा जाता है), वापसी प्रकार के रूप में अभिव्यक्ति का उपयोग कर के रूप में निम्नलिखित के लिए एक समाधान नहीं है।

यह कहना है कि Wiki में यह समस्या काफी अच्छी तरह से समझाई गई है (मुझे लगता है)।

+1

... यह सही नहीं है क्योंकि यह दायरे में होने से पहले 't' और' u' का उपयोग करता है (वे केवल पैरामीटर सूची में घोषित किए जाते हैं)। –

0

-> फ़ंक्शन घोषणाओं में ऑपरेटर "ऑटो" लौटने वाले कार्यों के लिए रिटर्न प्रकार निर्दिष्ट करता है। यह सी ++ 11 मानक के अध्याय 8 में परिभाषित किया गया है।

3

[dcl.spec.auto]/2 बताते हैं कि कैसे ऑटो वापसी प्रकार के साथ समारोह घोषणा लिखने के लिए:

ऑटो प्रकार-विनिर्देशक पीछे-रिटर्न-प्रकार के साथ एक समारोह declarator साथ दिखाई दे सकते हैं (8.3 .5) किसी भी संदर्भ में जहां इस तरह के एक घोषणाकर्ता वैध है।

और फिर बाद में, [डीसीएल।एफटीसी]/12, एक नोट है:

टाइपिफ़ीफ और पीछे-वापसी-प्रकार कभी-कभी सुविधाजनक होते हैं जब फ़ंक्शन का रिटर्न प्रकार जटिल होता है। उदाहरण के लिए, ऊपर समारोह fpif

typedef int IFUNC(int); 
IFUNC* fpif(int); 

या

auto fpif(int)->int(*)(int) 

एक अनुगामी-रिटर्न प्रकार एक प्रकार है कि अधिक declarator-आईडी से पहले निर्दिष्ट करने के लिए जटिल हो सकता है के लिए सबसे उपयोगी है घोषित किया जा सकता था :

template <class T, class U> auto add(T t, U u) -> decltype(t + u); 

बजाय

template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u); 
1

->पिछला रिटर्न प्रकार है।

सी ++ 11 ने एक वैकल्पिक समारोह घोषणा वाक्यविन्यास का प्रस्ताव दिया। auto कीवर्ड सामान्य फ़ंक्शन रिटर्न प्रकार का स्थान लेता है, और वास्तविक रिटर्न प्रकार -> के बाद जाता है।

उदाहरण के लिए,

auto f (int a, int b) -> int; 

यह सुविधा टेम्पलेट कार्यों जहां वापसी प्रकार टेम्पलेट मापदंडों से निष्कर्ष निकाला जाना है के लिए सबसे उपयोगी है

int f(int a, int b); 

के बराबर है।

उदाहरण के लिए,

template <class T, class U> 
auto add(T t, U u) -> decltype(t + u); 

वापसी प्रकार अभिव्यक्ति (t+u) के प्रकार होगा। > ऑपरेटर वहाँ में कर रही है, और जहां मैं इस वाक्य रचना के बारे में अधिक सीख सकते हैं -

1

क्या है?

cprogramming पर इसके बारे में बहुत अच्छी व्याख्या है।

-> (आपके मामले में) या ऑटो का उपयोग करने का सार, decltype सुविधा है और आपको प्रोग्रामिंग तर्क पर अधिक ध्यान केंद्रित करने देता है।

पीछे पीछे वापसी प्रकार (->) फ़ंक्शन घोषणा में वापसी प्रकार की जानकारी शामिल करने में आपकी सहायता करता है।

अपने वैकल्पिक उदाहरण के मामले में:

auto add(T t, U u) 
{ 
    decltype(t + u); 
} 

समारोह काफी जटिल है, तो यह अपने कार्यक्रम के एक पाठक के लिए बहुत मुश्किल नहीं है (जाहिर स्पष्ट) क्या उम्मीद वापसी प्रकार यह पता लगाने के लिए होगा है।

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