Ketika saya mencoba dan mengkompilasi kode ini (VS2010) saya mendapatkan kesalahan berikut:
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;
});
}
Bagaimana saya menentukan bahwa lambda memiliki tipe pengembalian 'void'. Terlebih lagi, bagaimana cara menentukan bahwa lambda memiliki tipe kembalian 'bool'?
MEMPERBARUI
Kompilasi berikut. Bisakah seseorang memberi tahu saya mengapa yang terkompilasi dan yang lainnya tidak?
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); }));
}
->
, misalnya[&](double d) -> double { //...
[&]...
), karena apa yang Anda miliki saat ini tidak perlu bertele-tele.[&expression, &start, &end, &what, &flags]...
(milikmu) vs[&]...
(milikku). Sekarang beri tahu saya siapa yang lebih bertele-tele. ;)[&]
memberi tahu lambda untuk menangkap semua yang Anda gunakan di dalam tubuh lambda, dengan referensi. Ini disebut "capture default". Yang lainnya adalah[=]
dan akan ditangkap dengan salinan.Jawaban:
Anda bisa secara eksplisit menentukan tipe kembalian lambda dengan menggunakan
-> Type
setelah daftar argumen:Namun, jika lambda memiliki satu pernyataan dan pernyataan itu adalah pernyataan kembali (dan mengembalikan ekspresi), kompilator bisa menyimpulkan tipe pengembalian dari tipe satu ekspresi yang dikembalikan. Anda memiliki banyak pernyataan di lambda Anda, jadi itu tidak menyimpulkan jenisnya.
sumber
return nullptr;
dapat melempar kunci pas dalam pengurang jenis, meskipun itu valid sebagai jenis penunjuk apa pun yang dikembalikan.Jenis kembalian lambda (dalam C ++ 11) dapat disimpulkan, tetapi hanya jika ada tepat satu pernyataan, dan pernyataan itu adalah
return
pernyataan yang mengembalikan ekspresi (misalnya, daftar penginisialisasi bukan ekspresi). Jika Anda memiliki lambda multi-pernyataan, maka jenis kembalian diasumsikan tidak berlaku.Karena itu, Anda harus melakukan ini:
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; })
Tapi sungguh, ekspresi keduamu jauh lebih mudah dibaca.
sumber
);
di akhir?Anda dapat memiliki lebih dari satu pernyataan saat masih mengembalikan:
[]() -> your_type {return ( your_statement, even_more_statement = just_add_comma, return_value);}
http://www.cplusplus.com/doc/tutorial/operators/#comma
sumber