Lambda Rücksendung selbst: ist das legal?

Betrachten diese ziemlich nutzloses Programm:

#include <iostream>
int main(int argc, char* argv[]) {

  int a = 5;

  auto it = [&](auto self) {
      return [&](auto b) {
        std::cout << (a + b) << std::endl;
        return self(self);
      };
  };
  it(it)(4)(6)(42)(77)(999);
}

Grundsätzlich sind wir versucht zu machen, ein lambda, das gibt sich.

  • MSVC kompiliert das Programm, und es läuft
  • gcc kompiliert das Programm, und es segfaults
  • clang lehnt das Programm mit einer Meldung:

    error: function 'operator()<(lambda at lam.cpp:6:13)>' with deduced return type cannot be used before it is defined

Dem compiler ist die richtige? Ist es eine statische constraint-Verletzung, UB, oder nicht?

Update diese geringfügigen änderungen akzeptiert clang:

  auto it = [&](auto& self, auto b) {
          std::cout << (a + b) << std::endl;
          return [&](auto p) { return self(self,p); };
  };
  it(it,4)(6)(42)(77)(999);

Update 2: ich verstehen Sie, wie schreiben Sie einen Funktor, der gibt sich selbst, oder wie die Y combinator, dies zu erreichen. Das ist mehr eine Sprache-Anwalt Frage.

Update 3: die Frage ist nicht, ob es legal ist für einen lambda-Ausdruck zur Rückgabe selbst im Allgemeinen, sondern über die Rechtmäßigkeit dieses spezifische Art und Weise, dies zu tun.

Verwandte Frage: C++ lambda Rücksendung selbst.

  • clang sieht mehr anständige in diesem moment, Frage ich mich, ob so ein Konstrukt kann auch typecheck, eher landet es in einem unendlichen Baum.
  • Wenn ich dieses Beispiel ausführen mit msvc manchmal geht es, aber in der Regel endet es mit seg-fault.
  • Ihre Frage, ob es legal ist, die sagt, das ist eine Sprache, die-Anwalt Frage, aber einige der Antworten, die nicht wirklich in das Konzept ... es ist wichtig, um die tags richtig
  • Danke, aded ein tag
  • ja die aktualisierte verwendet man auto& self wodurch die baumelnden Referenz-problem.
  • Ein interessanter Leckerbissen von einem theoretischen Standpunkt aus ist das korrekt definierten und auswertbaren lambda-Ausdrücke können nur die Rekursion (im Allgemeinen), wenn der Typ angegeben mit ausdrückliche Erklärung und in der Tat glaube ich, dass es vielleicht ein theorem in der ursprünglichen lambda-Kalkül besagt, dass solche Typen sind nicht ableitbar (mehrdeutig), wenn es nicht von einer person. Also während ich kann nicht sagen, was der Fehler ist oder was die c++ - Gründe sind, es ist keine kleine überraschung für mich, dass eine Sprache, die Probleme beim Umgang mit diesem. btw, wenn Sie glauben, dies sollte eine Antwort sein, lass es mich wissen, ich werde es verschieben.
  • die C++ - Lambda-Ausdrücke sind wirklich nicht theoretische lambda-Ausdrücke. C++ hat eine eingebaute rekursive Typen, die das original einfach typisierte lambda-Kalkül Ausdrücken können, so kann es haben, Dinge, die isomorph zu a: a->a und andere Unmögliche Konstrukte.
  • Vage Verwandte: stackoverflow.com/q/8595061/560648
  • genug, aber die Probleme können sich noch halten und ist wahrscheinlich der Grund für bestimmte Entscheidungen..
  • zur Klärung der Frage ist, dass, wenn einer schreibt eine rekursive Funktion ohne Angabe eines Typs gibt es Fälle, in denen die Art könnten mehrere Dinge. Natürlich, c++ und einige Dinge umgehen, indem Sie explizit den Typ. Die überprüfung eines Typs konsistent ist afaik immer möglich.

Schreibe einen Kommentar