2012-03-08 15 views
48

की स्पष्ट वापसी प्रकार जब मैं कोशिश करते हैं और इस कोड (VS2010) मैं निम्न त्रुटि हो रही है संकलन: error C3499: a lambda that has been specified to have a void return type cannot return a valueलैम्ब्डा

void DataFile::removeComments() 
{ 
    string::const_iterator start, end; 
    boost::regex expression("^\\s?#"); 
    boost::match_results<std::string::const_iterator> what; 
    boost::match_flag_type flags = boost::match_default; 
    // Look for lines that either start with a hash (#) 
    // or have nothing but white-space preceeding the hash symbol 
    remove_if(rawLines.begin(), rawLines.end(), [&expression, &start, &end, &what, &flags](const string& line) 
    { 
    start = line.begin(); 
    end = line.end(); 
    bool temp = boost::regex_search(start, end, what, expression, flags); 
    return temp; 
    }); 
} 

मैं लैम्ब्डा एक 'शून्य' वापसी प्रकार है कि निर्दिष्ट किया कैसे। अधिक से अधिक, मैं कैसे निर्दिष्ट करूं कि लैम्ब्डा में 'बूल' रिटर्न प्रकार है?

अद्यतन

निम्नलिखित संकलित करता है। क्या कोई मुझे बता सकता है कि क्यों संकलित करता है और दूसरा नहीं करता?

void DataFile::removeComments() 
{ 
    boost::regex expression("^(\\s+)?#"); 
    boost::match_results<std::string::const_iterator> what; 
    boost::match_flag_type flags = boost::match_default; 
    // Look for lines that either start with a hash (#) 
    // or have nothing but white-space preceeding the hash symbol 
    rawLines.erase(remove_if(rawLines.begin(), rawLines.end(), [&expression, &what, &flags](const string& line) 
    { return boost::regex_search(line.begin(), line.end(), what, expression, flags); })); 
} 
+4

आप स्पष्ट रूप से 'यह निर्दिष्ट कर सकते हैं ->', उदा '[&] (डबल डी) -> डबल {// ...' – Flexo

+2

मैं आपको सलाह देता हूं कि आपको केवल वही चर (केवल '[&] ...') पर कब्जा कर लें, जैसा कि आपके पास वर्तमान में है अनावश्यक रूप से verbose। – Xeo

+0

@Xeo क्या आप मुझे बता सकते हैं कि इसका वर्बोज़ क्यों? मुझे लैम्ब्डा में क्या, अभिव्यक्ति और झंडे की ज़रूरत है और यही वह है जिसे मैंने कब्जा कर लिया है। मैं किस कटौती काट सकता हूं? – Ryan

उत्तर

114

आप स्पष्ट रूप से तर्क सूची के बाद -> Type का उपयोग करके एक लैम्ब्डा की वापसी के प्रकार का उल्लेख कर सकते हैं:

[]() -> Type { } 

हालांकि, एक लैम्ब्डा एक बयान है और कि बयान एक वापसी कथन है अगर (और यह एक अभिव्यक्ति देता है), संकलक रिटर्न प्रकार को उस लौटाए गए अभिव्यक्ति के प्रकार से घटा सकता है। आपके लैम्बडा में आपके कई कथन हैं, इसलिए यह प्रकार को कम नहीं करता है।

+3

संकलक ऐसा कर सकता है, लेकिन मानक इसे करने के लिए मना करता है। –

+7

-1: यह एक कंपाइलर बग नहीं है। मानक इस पर बहुत स्पष्ट है: धारा 5.1.2, अनुच्छेद 4 बताता है कि कटौती कैसे की जाती है और यह किस स्थितियों में है। –

+2

@ निकोलबोलस तय। –

9

एक लैम्ब्डा की वापसी प्रकार निष्कर्ष निकाला जा सकता है लेकिन केवल जब वहाँ ठीक एक बयान है, और कहा कि बयान एक return बयान है कि एक अभिव्यक्ति देता है (एक प्रारंभकर्ता सूची नहीं एक अभिव्यक्ति, उदाहरण के लिए) है। यदि आपके पास बहु-कथन लैम्ब्डा है, तो वापसी का प्रकार शून्य माना जाता है।

इसलिए, आप इस करना चाहिए:

remove_if(rawLines.begin(), rawLines.end(), [&expression, &start, &end, &what, &flags](const string& line) -> bool 
    { 
    start = line.begin(); 
    end = line.end(); 
    bool temp = boost::regex_search(start, end, what, expression, flags); 
    return temp; 
    }) 

लेकिन वास्तव में, अपनी दूसरी अभिव्यक्ति एक बहुत अधिक पठनीय है।

+0

अच्छा उदाहरण; nitpick: क्या आपका फ़ंक्शन कॉल गुम है '); अंत में? – kevinarpe

2

आप एक से अधिक बयान हो सकता है जब अभी भी वापसी:

[]() -> your_type {return (
     your_statement, 
     even_more_statement = just_add_comma, 
     return_value);} 

http://www.cplusplus.com/doc/tutorial/operators/#comma

+2

अल्पविराम एक विद्रोही ऑपरेटर है। यह उन लोगों को भ्रमित करता है जो इसके अस्तित्व या प्राथमिकता स्तर से अवगत नहीं हैं। आईएमओ का वैध उपयोग कभी भी नहीं होता है। इसे हमेशा अधिक कार्यों या अन्यथा बेहतर संगठित कोड से बचा जा सकता है। – jheriko

+0

@ जेरिकिको सहमत हैं, मेरे उत्तर का अस्तित्व केवल उन लोगों के लिए है जो वास्तव में एक स्वतंत्र एक-लाइनर समाधान एक्सडी चाहते हैं (यह अभी भी एक पंक्ति है, है ना?)। अल्पविराम वास्तव में ध्यान देने योग्य नहीं है, और कोई भी इस फ़ॉर्म में पूरी मुख्य विधि कभी नहीं रखेगा। – Valen

+1

यकीन है कि, आप निश्चित रूप से एक वैध उत्तर दे रहे हैं, मैं केवल बुरे अभ्यास को प्रोत्साहित करने या यहां तक ​​कि प्रदर्शन करने के लिए कुछ भी करने का प्रशंसक नहीं हूं। एक बार लोग सीखते हैं कि अल्पविराम एक ऑपरेटर है जब तक कि वे इसका दुरुपयोग शुरू नहीं करते हैं और जब तक वे बेहतर सीख नहीं लेते हैं, तब तक एक उलटी गिनती होती है। :) – jheriko

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