Wenn ich versuche, diesen Code (VS2010) zu kompilieren, wird folgende Fehlermeldung angezeigt:
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;
});
}
Wie habe ich angegeben, dass das Lambda einen Rückgabetyp "void" hat? Wie kann ich außerdem angeben, dass das Lambda den Rückgabetyp 'bool' hat?
AKTUALISIEREN
Das Folgende wird kompiliert. Kann mir bitte jemand sagen, warum das kompiliert und der andere nicht?
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); }));
}
->
zB[&](double d) -> double { //...
[&]...
) benötigen , da das, was Sie derzeit haben, unnötig ausführlich ist.[&expression, &start, &end, &what, &flags]...
(deine) gegen[&]...
(meine). Jetzt sag mir, wessen ausführlicher ist. ;)[&]
weist das Lambda an, alles, was Sie im Lambda-Körper verwenden, als Referenz zu erfassen. Es wird als "Capture-Standard" bezeichnet. Der andere ist[=]
und wird per Kopie erfasst.Antworten:
Sie können den Rückgabetyp eines Lambda explizit angeben, indem Sie
-> Type
nach der Argumentliste Folgendes verwenden:Wenn ein Lambda jedoch eine Anweisung hat und diese Anweisung eine return-Anweisung ist (und einen Ausdruck zurückgibt), kann der Compiler den Rückgabetyp aus dem Typ dieses einen zurückgegebenen Ausdrucks ableiten. Sie haben mehrere Anweisungen in Ihrem Lambda, daher wird der Typ nicht abgeleitet.
quelle
return nullptr;
kann einen Schraubenschlüssel in den Typabzug werfen, obwohl er gültig ist, unabhängig davon, welcher Zeigertyp ansonsten zurückgegeben wird.Der Rückgabetyp eines Lambda (in C ++ 11) kann abgeleitet werden, jedoch nur, wenn genau eine Anweisung vorhanden ist und diese Anweisung eine
return
Anweisung ist, die einen Ausdruck zurückgibt (eine Initialisierungsliste ist beispielsweise kein Ausdruck). Wenn Sie ein Lambda mit mehreren Anweisungen haben, wird angenommen, dass der Rückgabetyp ungültig ist.Deshalb sollten Sie Folgendes tun:
Aber wirklich, Ihr zweiter Ausdruck ist viel besser lesbar.
quelle
);
am Ende?Sie können mehr als eine Anweisung haben, wenn Sie noch zurückkehren:
http://www.cplusplus.com/doc/tutorial/operators/#comma
quelle