Почему типы закрытия/лямбда-выражения не имеют конструктора по умолчанию в C++

По какой причине у лямбда-выражений нет конструктора по умолчанию? Есть ли за этим какая-то техническая причина, или это чисто дизайнерское решение?


person Vincent    schedule 16.12.2016    source источник
comment
Какова будет цель этого? Он создается, когда вы его объявляете.   -  person NathanOliver    schedule 17.12.2016
comment
Как вы думаете, что делает конструктор по умолчанию?   -  person    schedule 17.12.2016
comment
@NathanOliver, мне бы понравилась построенная по умолчанию лямбда-функция в этом ответе. Думайте об этом как об аналоге nullptr для указателей.   -  person R Sahu    schedule 17.12.2016
comment
Конструктор подразумевает существование класса. Лямбда-выражение может генерировать класс или нет. Но даже если и так, какое у него может быть имя? Для лямбды, не имеющей состояния, не имеет смысла реализовывать ее как класс, а скорее как функцию.   -  person John Griffin    schedule 17.12.2016
comment
@JohnGriffin Каждое лямбда-выражение имеет соответствующий тип замыкания. Не думаю, что для такого решения есть техническая причина.   -  person Columbo    schedule 17.12.2016
comment
@Columbo Может ли это быть связано с тем, что элемент, захваченный по ссылке, может привести к безымянному нестатическому элементу данных? Конструктор по умолчанию в этом случае работать не будет: int main() { int i; auto l1 = [&i](){}; decltype(l1) l2; }.   -  person skypjack    schedule 17.12.2016
comment
@skypjack Это не причина не предоставлять конструктор по умолчанию; он будет просто определен как удаленный.   -  person Columbo    schedule 17.12.2016
comment
@Коломбо Туше. На самом деле это имеет смысл. Спасибо.   -  person skypjack    schedule 17.12.2016
comment
Что это означает: нет или удалено в Типы закрытия имеют удаленный (до С++ 14) конструктор по умолчанию (начиная с С++ 14). из cppreference?   -  person Spectral Sequence    schedule 17.12.2016
comment
Это может показаться банальным, но лямбда-функции — это функции в духе лямбда-исчисления. Функции не имеют конструкторов времени выполнения. (да, функциональные контейнеры, такие как std::function(), работают, но не функции).   -  person JimmyNJ    schedule 17.12.2016
comment
@JimmyNJ: Lambdas - это функторы, иначе у них не было бы захватов.   -  person ildjarn    schedule 17.12.2016
comment
@ildjarn, если лямбда-функции являются функторами, почему у них нет c'tors по умолчанию? Тот факт, что лямбда захватывает локальные переменные, не очень важен, любой вызов функции может захватывать локальные переменные, вам просто нужно явно ввести аргументы. Если оставить в стороне детали реализации, остается основной вопрос, почему функции не имеют конструкторов, и я думаю, что мой ответ соответствует духу лямбда-исчисления.   -  person JimmyNJ    schedule 17.12.2016
comment
@JimmyNJ Суть в том, что лямбда создает объект типа с operator(), а не функцию.   -  person ildjarn    schedule 17.12.2016
comment
@ildjarn: я согласен с точки зрения C ++ OO. Но я хотел бы знать, можете ли вы придумать пример чистой функции (скажем, в простом старом смысле C), которая действительно определяется во время выполнения?   -  person JimmyNJ    schedule 17.12.2016
comment
@SpectralSequence: это не означает, что лямбда-выражения могут иметь конструкторы, просто не известный тип, и в силу наличия этих конструкторов конструктор по умолчанию не создается. (неявно удалено)... Думаю. Я полагаю, что лямбда-выражения будут подвергаться агрегатной инициализации в C++17, поэтому мы можем создавать объекты-функции посредством наследования от нескольких лямбда-выражений. См. комментарии к этот ответ   -  person AndyG    schedule 20.12.2016


Ответы (1)


Лямбда-выражения в C++ — это синтаксическое удобство, позволяющее программисту избежать объявления функтора с использованием традиционного синтаксиса, такого как

struct my_functor
{
bool operator()(Object &) { /* do something */ return false; }
}

потому что написание функторов с использованием этого синтаксиса считается слишком длинным для простых функций.

Lambdas предлагает параметры захвата параметров, например [=], [&] и т. д., чтобы избавить вас от объявления переменных и их инициализации, как вы могли бы сделать в конструкторе объекта-функтора.

Таким образом, Lambdas не предоставляет вам никакого синтаксиса конструктора по своему дизайну.

Нет технической причины, по которой лямбда-функция не могла бы раскрыть конструктор, однако, если бы она это сделала, она перестала бы имитировать концепцию дизайна, для которой она названа.


С благодарностью к комментаторам под вопросом.

person JimmyNJ    schedule 20.12.2016
comment
Однако лямбда-выражения предоставляют конструкторы копирования и перемещения. - person AndyG; 20.12.2016
comment
С++ 20 также предлагает конструкторы с лямбда-выражениями. - person John; 02.08.2021