लैंबडा का स्पष्ट रिटर्न प्रकार


93

जब मैं इस कोड (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); }));
}

6
आप स्पष्ट रूप से यह निर्दिष्ट कर सकते हैं ->जैसे,[&](double d) -> double { //...
Flexo

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

2
[&expression, &start, &end, &what, &flags]...(तुम्हारा) बनाम [&]...(मेरा)। अब बताओ किसकी क्रिया अधिक है। ;) [&]लैम्ब्डा को सब कुछ जिसे आप लैम्बडा बॉडी के अंदर इस्तेमाल करते हैं, संदर्भ द्वारा कैप्चर करने के लिए कहते हैं। इसे "कैप्चर डिफ़ॉल्ट" कहा जाता है। अन्य एक है [=]और प्रतिलिपि द्वारा कैप्चर करेगा।
Xeo

1
@Xeo, प्रभावी मॉडर्न C ++, आइटम 31, लटकते संदर्भों से बचने के लिए, स्पष्ट रूप से कैप्चर करने की सिफारिश करता है। मुझे लगता है कि कुछ समय के लिए खुद को laz ... एर, संक्षिप्त होने की सजा के रूप में काट लिया गया है। :-)
एमिल कॉर्मियर

2
वैसे, सी ++ 14 में कटौती किए गए रिटर्न-प्रकार के लंबोदर पर बाधाओं को कम किया जाता है। शरीर में एक से अधिक स्टेटमेंट वाले लैम्ब्डा के लिए रिटर्न टाइप्स को घटाया जा सकता है, और जब तक प्रत्येक रिटर्न स्टेटमेंट की अभिव्यक्ति एक ही प्रकार की न हो जाए, अब आपके पास कई रिटर्न स्टेटमेंट्स के साथ कम रिटर्न वाले टाइप हो सकते हैं।
एंथनी हॉल

जवाबों:


192

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

[]() -> Type { }

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


4
संकलक ऐसा कर सकता है, लेकिन मानक इसे करने के लिए मना करता है।
जोहान्स शाउब -

9
-1: यह कंपाइलर बग नहीं है। इस पर मानक बहुत स्पष्ट है: खंड 5.1.2, पैराग्राफ 4 यह बताता है कि कटौती कैसे की जाती है और यह किस स्थिति में है।
निकोल बोलस

2
हालांकि मुझे नवीनतम ड्राफ्ट के अनुसार इसकी अनुमति नहीं है, लेकिन ऐसा लग सकता है कि यह वास्तव में इस पैच gcc.gnu.org/ml/gcc-patches/2011-08/msg01901.html के लिए टिप्पणी द्वारा जाने वाले अंतिम चश्मे में अनुमत है। । किसी के पास सत्यापित करने के लिए अंतिम युक्ति है?
इलके

2
मैंने लैम्ब्डा एक्सप्रेशन का बड़े पैमाने पर उपयोग किया है और एक बार मैंने स्पष्ट रूप से रिटर्न टाइप नहीं किया है। वापसी प्रकार की कटौती (कम से कम VS2012 और VS2013 के तहत) लाम्बा अभिव्यक्ति में एक से अधिक रिटर्न स्टेटमेंट होने पर भी त्रुटिपूर्ण रूप से काम करती है। बेशक, विभिन्न वापसी बयानों को एक ही लंबोदर अभिव्यक्ति के भीतर मेल खाना चाहिए। उदाहरण के लिए "ऑटो f = [] (int i) {if (i> 5) जैसे विवरण सही होने पर वापस लौटें?};"; कोई समस्या नहीं है और यदि आप "ऑटो बी = एफ (10);" b, बूल का प्रकार होगा और निश्चित रूप से सत्य होगा;
स्प्राइट

1
return nullptr;भले ही वह सूचक प्रकार अन्यथा वापस आ गया हो, भले ही वह कटौती में एक रिंच फेंक सकता है।
ग्रेल्ट

16

एक लैम्ब्डा का वापसी प्रकार (C ++ 11 में) काटा जा सकता है, लेकिन केवल तब जब कोई एक कथन हो, और वह कथन एक 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;
  })

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


अच्छा उदाहरण; नाइटपिक: क्या आपका फ़ंक्शन कॉल );अंत में गायब है ?
केविनरपे

6

जब आप वापस आते हैं तो आपके पास एक से अधिक कथन हो सकते हैं:

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

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


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

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

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

@jheriko मैंने इसे एक बार सदस्य सूचीकरण सूची में एक दिलचस्प उपयोग के लिए देखा है, लेकिन यह सिर्फ गड़बड़ करने के लिए था, अगर मुझे सही याद है।
जस्टिन टाइम - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.