লাম্বদার সুস্পষ্ট রিটার্নের ধরণ


95

আমি এই কোডটি (ভিএস 2010) চেষ্টা ও সংকলন করার সময় আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি: 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 { //...
ফ্লেক্সো

4
আমি আপনাকে পরামর্শ দিচ্ছি যে কেবলমাত্র আপনার প্রয়োজনীয় পরিবর্তনগুলি কেবলমাত্র (কেবল [&]...) ক্যাপচার করার জন্য , যেমনটি বর্তমানে আপনার কাছে যা অকারণে ভার্বোজ রয়েছে তা ক্যাপচার করার পরামর্শ দেব ।
জিও

4
[&expression, &start, &end, &what, &flags]...(আপনার) বনাম [&]...(আমার) এখন আমাকে বলুন কার ভার্বোস বেশি। ;) [&]ল্যাম্বডাকে বলছে যে আপনি ল্যাম্বডা দেহের অভ্যন্তরে ব্যবহার করেন এমন সমস্ত জিনিস ক্যাপচার করতে, উল্লেখ করে। একে "ক্যাপচার ডিফল্ট" বলা হয়। অন্যটি হ'ল [=]এবং অনুলিপি দ্বারা ক্যাপচার করবে।
Xeo

4
রেজিস্ট্রেশন উল্লেখ এড়ানোর জন্য @ এক্সও, কার্যকর আধুনিক সি ++, আইটেম 31, স্পষ্টভাবে ক্যাপচারের পরামর্শ দেয়। ল্যাজ ... এর, সংক্ষিপ্ত হওয়ার শাস্তি হিসাবে আমি কয়েকবার কামড়েছি। :-)
এমিল কর্মিয়ার

4
যাইহোক, সি ++ 14 এ ছাড়ের রিটার্ন-টাইপ ল্যাম্বডাসের উপর সীমাবদ্ধতাগুলি হ্রাস পেয়েছে। শরীরে একাধিক স্টেটমেন্ট সহ ল্যাম্বডাসের জন্য রিটার্নের ধরণগুলি কেটে নেওয়া যেতে পারে এবং যতক্ষণ না প্রতিটি রিটার্নের স্টেটমেন্টের এক্সপ্রেশন একই রকম থাকে, আপনি এখন একাধিক রিটার্ন স্টেটমেন্ট সহ একটি ছাড়ের রিটার্ন টাইপ রাখতে পারবেন।
অ্যান্টনি হল

উত্তর:


197

আপনি সুস্পষ্টভাবে -> Typeআর্গুমেন্ট তালিকার পরে ল্যাম্বডায় ফেরতের ধরণটি নির্দিষ্ট করতে পারেন :

[]() -> Type { }

তবে, যদি কোনও ল্যাম্বডায় একটি বিবৃতি থাকে এবং সে বিবৃতিটি একটি রিটার্ন স্টেটমেন্ট হয় (এবং এটি একটি অভিব্যক্তি ফেরত দেয়), সংকলকটি তার ফিরে আসা এক্সপ্রেশনটির ধরণ থেকে রিটার্নের ধরণটি কেটে নিতে পারে। আপনার ল্যাম্বডায় আপনার একাধিক বিবৃতি রয়েছে, সুতরাং এটি টাইপটি হ্রাস করে না।


4
সংকলক এটি করতে পারে তবে মানক এটি করতে নিষেধ করে।
জোহানেস স্কাউব - 8:32

10
-1: এটি কোনও সংকলক বাগ নয়। স্ট্যান্ডার্ড এটিতে খুব স্পষ্ট: বিভাগ 5.1.2, অনুচ্ছেদ 4 অনুচ্ছেদটি কীভাবে ছাড় হয় এবং কোন পরিস্থিতিতে এটি হয় তা উল্লেখ করে।
নিকল বোলাস

4
সর্বশেষ খসড়া অনুসারে এটি অনুমোদিত না হলেও আমি দেখতে পেলাম যে এই প্যাচ gcc.gnu.org/ML/gcc-patches/2011-08/msg01901.html এর মন্তব্য দ্বারা চূড়ান্ত চশমাগুলিতে এটি অনুমোদিত বলে মনে হচ্ছে actually । চূড়ান্ত পরীক্ষা আছে কারও কাছে?
ইলকে

4
আমি ল্যাম্বডা এক্সপ্রেশনগুলি ব্যাপকভাবে ব্যবহার করেছি এবং একবারে আমি স্পষ্টভাবে ফেরতের ধরণটি বর্ণনা করি নি। ল্যাম্বদা এক্সপ্রেশনটিতে একাধিক রিটার্নের স্টেটমেন্ট না থাকলেও রিটার্নের ধরণের (কমপক্ষে VS2012 এবং VS2013 এর অধীনে) ছাড়পত্র নির্বিঘ্নে কাজ করে। অবশ্যই, বিভিন্ন রিটার্নের স্টেটমেন্টগুলির একই ল্যাম্বডা এক্সপ্রেশনগুলির মধ্যে মিল থাকা দরকার। যেমন একটি বিবৃতি যেমন "অটো এফ = [] (ইনট্রি আই) {যদি (i> 5) সত্য ফিরে আসে; মিথ্যা প্রত্যাবর্তন করুন;};" কোনও সমস্যা ছাড়াই সংকলন করে এবং আপনি যদি "অটো বি = এফ (10) কল করেন;" বি টাইপ বুলের হবে এবং অবশ্যই সত্য হবে;
স্প্রাইট

4
return nullptr;টাইপ ছাড়ের ক্ষেত্রে একটি রেঞ্চ ছুঁড়ে ফেলতে পারে, যদিও পয়েন্টার ধরণের যা অন্যথায় ফিরে আসে তা বৈধ as
গ্রেট

16

একটি ল্যাম্বডার রিটার্নের ধরণ (সি ++ 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
কমা একটি বিবর্তনকারী অপারেটর। এটি এমন লোককে বিভ্রান্ত করে যারা এর অস্তিত্ব বা অগ্রাধিকার স্তর সম্পর্কে অবগত নয়। ইমোতে কোনও বৈধ ব্যবহার নেই। এটি সবসময় আরও ফাংশন বা অন্যথায় আরও ভাল সংগঠিত কোড সহ এড়ানো যায়।
ঝেরিকো

@ ঝেরিকো সম্মত হন, আমার উত্তরের অস্তিত্ব কেবলমাত্র তাদের পক্ষে যারা সত্যিকার অর্থেই একটি স্বাধীন ওয়ান-লাইনার সমাধান এক্সডি চান (এটি এখনও একটি লাইন, তাই না?)। কমাটি সত্যই লক্ষণীয় নয় এবং এই ফর্মের মধ্যে কেউ কখনও পুরো মূল পদ্ধতিটি রাখে না।
ভ্যালেন

4
নিশ্চিত, আপনি অবশ্যই একটি বৈধ উত্তর দিচ্ছেন, আমি খারাপ অনুশীলনকে উত্সাহিত করতে বা এমনকি প্রদর্শন করার জন্য কখনও কিছু করার ভক্ত নই। লোকেরা একবার শিখবে যে কমাটি অপারেটর এটির একটি কাউন্টডাউন হয় যতক্ষণ না তারা এটিকে গালাগালি শুরু করে এবং যতক্ষণ না তারা আরও ভাল শেখে। :)
ঝেরিকো

@ ঝেরিকো আমি দেখেছি এটি একবার সদস্য ইনিশিয়েশন তালিকায় আকর্ষণীয়ভাবে ব্যবহার করতে পেরেছিল, তবে এটি যদি আমি সঠিকভাবে মনে রাখি তবে কেবল গোলমাল করার জন্য ছিল।
জাস্টিন সময় - মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.