2017-12-13 5 views
1

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?
+3

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

+1

'[] (int i) {wenn (i <0) return -i; sonst gebe ich zurück; } ist ab C++ 14 völlig in Ordnung. – cpplearner

+4

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). –

Antwort

3

Von lambda:

... der Rückgabetyp des Fahrers Verschluss() ermittelt nach folgenden Regeln:

  • wenn der Körper nichts besteht aber Eine einzelne Rückgabeanweisung mit einem Ausdruck, der Rückgabetyp ist der Typ des zurückgegebenen Ausdrucks (nach lvalue-to-rvalue, array-to-pointer oder function-to-pointer implizite Konvertierung); Andernfalls ist der Rückgabetyp ungültig. (bis C++ 14)

  • Der Rückgabetyp ist von der Rückgabe Aussagen abgeleitet, als ob für eine Funktion deren Rückgabetyp ist auto erklärt. (seit C++ 14)

So beschreibt der Autor nur die Situation vor C++ 14, da C++ 14 der Code funktioniert perfekt.

+0

Danke, ich benutze C++ 14 Compiler, also ist es der wahre Grund. –

Verwandte Themen