Verstehen, wie der Lambda-Verschlusstyp den Standardkonstruktor gelöscht hat

Ab 5.1.2

[19] Der mit einem Lambda-Ausdruck verknüpfte Verschlusstyp hat einen gelöschten (8.4.3) Standardkonstruktor und ein gelöschter Kopierzuweisungsoperator. Es hat einen implizit deklarierten Kopierkonstruktor (12.8) und möglicherweise einen implizit deklarierten Verschiebungskonstruktor (12.8). [Hinweis: Der Kopier- / Verschiebekonstruktor wird implizit wie jeder andere implizit deklarierte Kopier- / Verschiebekonstruktor implizit definiert. —Ende Notiz]

Ich lese gerade C ++ Primer 14.8.1 durch, in dem erklärt wird, wie Lambda-Ausdrücke vom Compiler in ein unbenanntes Objekt einer unbenannten Klasse übersetzt werden. Wie kann ich Objekte von Lambda-Funktionen definieren, die keine Lambda-Erfassung enthalten, wenn der Standardkonstruktor gelöscht wird?

 auto g = [](){};

Ist das konzeptionell nicht dasselbe wie ...

 class lambdaClass{
 public:
      lambdaClass() = delete;
      lambdaClass& operator=(const lambdaClass&) = delete;
      void operator()(){ }

      //copy/move constructor and destructor implicitly defined
};

auto g = lambdaClass(); //would be an error since default is deleted.

Wenn es ein Capture gab, dann ein Konstruktorander als der Standardkonstruktor wäre definiert und es wäre in Ordnung, solche Objekte zu initialisieren (solange ein Parameter übergeben wurde). Wenn es jedoch keine Erfassung gibt und der Standardkonstruktor gelöscht wird, scheint es konzeptionell nicht konsistent zu sein, dass ein Lambda-Klassenobjekt erstellt werden kann.

Edit: Hmm, vielleicht ist die Vorstellung, dass die Lambda-Klasse Konstruktoren in Abhängigkeit von ihren Lambda-Erfassungen erstellt, unbegründet, obwohl dies in C ++ Primer beschrieben ist (im Standard kann ich kein Zitat finden), da der folgende Code nicht funktioniert obwohl ich es konzeptionell erwarten würde:

int sz = 2;
auto a = [sz](){ return sz;};
decltype(a) b(10); //compiler error
decltype(a) b = a; //all good though

Antworten auf die Frage(2)

Ihre Antwort auf die Frage