2015-02-02 13 views
5

है इसलैम्ब्डा रिटर्न '1' हर समय

#include <iostream> 
using namespace std; 
int main() 
{ 
    cout<<[](){ return 0;}; 
    cout<<[](){ return 3.2;}; 
    cout<<[](){ return true;}; 
    cout<<[](){ return false;}; 
    cout<<[](){ return "Hello world!";}; 
    cout<<[]()->int{ return 0;}; 
    cout<<[]()->double{ return 3.2;}; 
    cout<<[]()->bool{ return true;}; 
    cout<<[]()->bool{ return false;}; 
    cout<<[]()->const char*{ return "Hello world!";}; 
    return 0; 
} 

की तरह कोड gcc version 4.8.2 के साथ संकलित करें और मेरे उत्पादन केवल 1111111111 है। क्यों केवल "1"?

+5

आप कभी भी भेड़ के बच्चे को नहीं बुलाते: '[]() {वापसी 10;}' बनाम '([]() {वापसी 10;})()'। – Zeta

+1

वीएस 2013 में मुझे त्रुटि संदेश "बाइनरी" मिलता है << ': कोई ऑपरेटर नहीं मिला जो' मुख्य :: TobiMcNamobi

+8

कोई कैप्चर वाले लैम्ब्डास फ़ंक्शन पॉइंटर पर पूरी तरह से परिवर्तनीय नहीं हैं, जो बदले में 'बूल' के लिए परिवर्तनीय रूप से परिवर्तनीय है। –

उत्तर

7

जब लैम्ब्डा अभिव्यक्ति में कोई कैप्चर नहीं होता है, तो यह निश्चित रूप से फ़ंक्शन पॉइंटर में परिवर्तनीय होता है।

बदले में एक फ़ंक्शन पॉइंटर bool पर परिवर्तनीय रूप से परिवर्तनीय है, true उत्पन्न करता है यदि सूचक शून्य नहीं है, जो मुद्रित हो जाता है।

यदि आपके आउटपुट से पहले cout << std::boolalpha, you'll see truetruetrue.... printed instead

यदि आप अपने लैम्ब्डा में कुछ कैप्चर करते हैं, तो यह अब फ़ंक्शन पॉइंटर में परिवर्तनीय नहीं है, और you'd get a compiler error है।

यदि आप लैम्ब्डा को कॉल करके लौटाए गए परिणाम को प्रिंट करना चाहते हैं, तो आपको () की आवश्यकता है, जैसा कि अन्य ने बताया है।

5

तुमने क्या कहा:

cout<<[](){ return 0;}; 

क्या आप कहना चाहते हैं:

cout<<[](){ return 0;}(); 

ब्रैकेट देखते हैं?

+0

धन्यवाद। अब यह सही काम करता है। –

5

क्या आप इस किया है, तो:

#include <iostream> 
using namespace std; 
void foo() 
{ 
} 
int main() 
{ 
    cout<<foo; 
    return 0; 
} 

आप विधि बुला नहीं रहे हैं, लेकिन इसका पता मुद्रित करने के लिए प्रयास करते हैं। cout के लिए ओवरलोड operator <<(bool) चुना गया है, इस प्रकार आप जिस भी वैध फ़ंक्शन को मुद्रित करने का प्रयास करते हैं, उसके लिए आपको 1 मिलता है।

वास्तव में, फ़ंक्शन (या लैम्बडास) को कॉल करें, () जोड़ें।

+0

यह बताने के लिए धन्यवाद कि मुझे हर बार "1" क्यों मिलता है। –

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