Ich lese C++ - Primer 5th edition, Kapitel 10 (lambdas Ausdrücke), Hier ist ein Programm, das negative Werte in einem Vektor durch ihren absoluten Wert ersetzen soll.Rückgabetypableitung von Lambdaausdrücken von if-else-Anweisungen
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { if (i < 0) return -i; else return i; });
Der Autor sagt, dass:
Dieser Code wird nicht kompiliert, da das Lambda den Rückgabetyp als
void
folgert aber wir wieder einen Wert und dies zu beheben, müssen wir einen nachgestellten Rückgabetyp verwenden .
Aber wenn ich diesen Code mit GNU GCC Compiler unter Windows kompiliere, funktioniert es gut.
Der Autor sagt auch, dass:
Diese Version kompiliert, weil wir nicht den Rückgabetyp angeben müssen, , weil diese Art von der Art des bedingten Operators abgeleitet werden.
transform(vi.begin(), vi.end(), vi.begin(),
[](int i) { return i < 0 ? -i : i; });
Also, meine Fragen sind:
- Warum mit der ersten Version, das Lambda der Rückkehr als nichtig Typ folgert und warum GNU GCC Compiler dies akzeptiert * (Ich dachte, dass vielleicht. wegen Optimierungen).?
- Warum mit der zweiten Version kann der Rückgabetyp aus dem Typ des bedingten Operators abgeleitet werden?
Das Lambda verwendet den zurückgegebenen Ausdruck, um den Rückgabetyp abzuleiten, so dass es nicht möglich ist, 'void' von' return 'abzuleiten ... Es gibt einen Fehler in diesem Buch. –
Quentin
'[] (int i) {wenn (i <0) return -i; sonst gebe ich zurück; } ist ab C++ 14 völlig in Ordnung. – cpplearner
Was in dem Buch geschrieben wurde, war für C++ 11 wahr, wurde aber mit C++ 14 verbessert, um mehrere 'return' Anweisungen zuzulassen (solange der zurückgegebene Typ übereinstimmt). –