Понимание того, как лямбда-тип замыкания удалил конструктор по умолчанию
С 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