C++11 und das fehlen von polymorphen Lambda-Ausdrücke - warum?

Ich habe die überprüfung der version der C++11 standard. Insbesondere den Abschnitt über lambdas, und ich bin verwirrt, als die Argumentation für die nicht-Einführung der polymorphe Lambda-Ausdrücke.

Beispielsweise unter den 100001 Möglichkeiten der polymorphe Lambda-Ausdrücke verwendet werden könnten, hatte ich gehofft, wir könnten, verwenden Sie code wie den folgenden:

template<typename Container>
void foo(Container c)
{
    for_each(c.begin(), c.end(), [](T& t) { ++t; });
}

Was waren die Gründe:

  • War es, als der Ausschuss lief die Zeit davon?

  • Dass der polymorphe Lambda-Ausdrücke sind zu schwer zu implementieren?

  • Oder vielleicht, dass Sie gesehen werden, nicht als erforderlich durch den PTB?

Hinweis: Bitte denken Sie daran, das Beispiel oben ist nicht der einzige, und es ist nur als eine Anleitung, um die Arten von code. Antworten, die sich ausschließlich konzentrieren auf die Bereitstellung eines workaround für das obige Stück code nicht als gültig angesehen werden!

Verwandte Quellen:

  • verdammt, was für ein Durcheinander syntax.
  • was ist falsch an der syntax? es ist eigentlich ganz nett.
  • Ich bin damit einverstanden. Obwohl, jeder der drei Sätze von Klammern gibt es eigentlich für einen Grund: der erste ([]) enthält die Liste der Variablen zu schließen, über-und/oder welche nicht zu schließen, sowie, wie, Sie zu fangen (by-reference oder by-value), der zweite (()) enthält der parameter Liste, der Dritte ({}) enthält der Körper. Aber, zum Beispiel, so etwas wie λt → ++t (wie in Haskell) statt [](T& t) { ++t; } wäre viel schöner.
  • Der Begriff ist nicht "in der Nähe über" man nennt Sie die capture-Liste. Im wesentlichen die Fähigkeit zum erfassen von Variablen, die entweder Referenz oder Kopie vom umschließenden Rahmen, zur Verwendung in lambda. - Ich persönlich denke, die syntax ist ganz nett.
  • Das ist, was "in der Nähe über" bedeutet. en.wikipedia.org/wiki/Closure_(computer_programming)
  • Jörg: ich weiß nicht bestreiten, dass jedes dieser Zeichen hat einen Grund - ich denke, es ist nur bloaty, aber das ist wahrscheinlich verursacht durch die Tatsache, dass er versucht zu patchen eines schon von Motten geritten Kleid, das war nicht gut, mit zu beginnen.
  • Naja, normalerweise sagt man "in der Nähe über die Umwelt". Die meisten Sprachen erlauben nicht, Sie explizit anzugeben, welche Teile der Umgebung und wie "nahe vorbei", Sie immer in der Nähe, über die ganze Umgebung, so gibt es keine vollständig etablierte Begriff für das, was tho es nennen, wenn Sie "erledigt" oder "erfassen" die einzelnen Variablen im Gegensatz zu der gesamten Umgebung.
  • Ich hasse den C++0x-die lambda-syntax auch, aber die syntax ist zumindest im Einklang mit dem Stil von C/C++. Haskell der lambda ist viel schöner, aber es sähe eher seltsam.
  • Es wäre ein Interessantes experiment, zu entfernen alles, die entlassen worden ist durch spätere Erweiterungen (z.B. entfernen Sie alle Formen der Initialisierung außer der uniform initialization syntax), damit die abstrakte syntax für die nicht-redundante Untermenge von C++ identisch zu dem, was es heute ist, aber design ist eine neue konkrete syntax mehr entlang der Linien von Scala und/oder Cobra und/oder Ruby (je nachdem, ob Sie lieber Klammern, Einrückungen oder keywords). Ich Wette, Sie können einige ziemlich gut aussehende Sprache, die zu 100% isomorph zu C++.
  • Die Sache über die C++ - syntax für Lambda-Ausdrücke ist, dass es so ziemlich unvermeidlich. In einem GC ' ed Sprache, die Sie bekommen können Weg mit einem normalen Verschluss, der einfach fängt alles von Referenz. In C++, Sie ziemlich viel müssen in der Lage sein, um anzugeben, ob eine variable erfasst werden soll, per Referenz oder Wert. Wenn es nicht für diese Anforderung, die []'s könnte leicht beseitigt werden.
  • Ich scheine zu erinnern, dass litb einmal erwähnt, dass die lambdas wurden monomorphe, da Sie sonst nicht spielen schön mit Konzepten. (das scheint wie ein erstaunlich dummes argument, und ist nur mit zusätzlichen ironisch jetzt, dass Konzepte wurden fallen gelassen) Vielleicht kann er uns aufklären über die details, wenn er Sie sieht diese Frage allerdings.
  • nun, die, die du verlinkt hast Kann lambda-Funktionen werden Vorlagen?, was ist Ihre Frage hinzufügen, was nicht schon dort beantwortet?
  • Meh. Ich kann auch ohne Leben. [](decltype(*begin) t) { ++t; }
  • nun, die Konzepte wurden fallen gelassen, kann es sein, dass Sie nicht hinzufügen, Vorlage lambdas, denn Sie wollen sein in der Lage, die Konzepte wieder in der Sprache der nächsten Zeit um.
  • Es sind genau 33 Möglichkeiten der polymorphe Lambda-Ausdrücke können verwendet werden?
  • vielleicht. (Oder nur, dass Sie fiel Konzepte, um Zeit zu sparen, und so wäre es albern, zu verbringen die zusätzliche Zeit, re-hinzufügen von features wie dieses, sobald Begriffe waren), Aber es scheint mir, dass die Vorstellung von Konzepten wird verkrüppelt, wenn es kann nicht Ausdrücken, der polymorphe Lambda-Ausdrücke. Vielleicht sollten Sie stattdessen konzentrierten sich auf die kommenden up mit mehr expressiven Konzepten. Wie es scheint, Sie waren einfach zu vernarrt in Konzepte und nicht bereit zu sehen, dass, wenn es nicht auszudrücken beliebten Funktionen der Sprache, dann ist es nicht das beliebte feature, das repariert werden muss, aber die Konzepte Spezifikation.
  • dann wieder, dieser basiert auf einem halb vergessenen Kommentar/Antwort von litb ich auf zu Lesen, SO Monaten. So nehmen Sie es für was es Wert ist. 😉

InformationsquelleAutor | 2011-01-10
Schreibe einen Kommentar