Понимание того, как лямбда-тип замыкания удалил конструктор по умолчанию

С 5.1.2

[19] Тип замыкания, связанный с лямбда-выражениемимеет удаленный (8.4.3) конструктор по умолчанию и оператор присвоения удаленной копии. Он имеет неявно объявленный конструктор копирования (12.8) и может иметь неявно объявленный конструктор перемещения (12.8). [Примечание: конструктор копирования / перемещения неявно определяется так же, как любой другой неявно объявленный конструктор копирования / перемещения неявно определяется. —Конечная записка]

Я читаю C ++ Primer 14.8.1, который объясняет лямбда-выражения, переводимые компилятором в безымянный объект безымянного класса. Как я могу определить объекты лямбда-функций, которые не содержат лямбда-захват, если конструктор по умолчанию удален?

 auto g = [](){};

Разве это не концептуально так же, как ...

 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.

Если был захват, то конструкторДругой чем конструктор по умолчанию будет определен, и было бы хорошо инициализировать объекты такого (до тех пор, пока параметр был передан). Но если нет захвата и конструктор по умолчанию удален, концептуально не представляется возможным, что объект класса лямбда может быть создан.

Изменить: Хм, может быть, концепция, что класс лямбда создает конструкторы в зависимости от его лямбда-захватов является необоснованным, несмотря на то, как это описано в C ++ Primer (я не могу найти это в стандарте), потому что следующий код не работает даже хотя я бы ожидал это концептуально:

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

Ответы на вопрос(1)

Ваш ответ на вопрос