A lambda expression can use a variable without capturing it if the variable
is a non-local variable or has static or thread local storage duration (in which case the variable cannot be captured), or is a reference that has been initialized with a constant expression. A lambda expression can read the value of a variable without capturing it if the variable
has const non-volatile integral or enumeration type and has been initialized with a constant expression, or is constexpr and has no mutable members.
Ну, по реализации ты сам контролируешь, захватываются переменные или нет. И если захватываются, то как - по ссылке, значению (которое может быть каким-нибудь shared_ptr).
Само понятие замыкания не описывает обязательность и безопасность захвата - оно описывает синтаксис. Но, конечно, в функциональных языках он подразумевается.
Ну, по реализации ты сам контролируешь, захватываются переменные или нет. И если захватываются, то как - по ссылке, значению (которое может быть каким-нибудь shared_ptr).
Само понятие замыкания не описывает обязательность и безопасность захвата - оно описывает синтаксис. Но, конечно, в функциональных языках он подразумевается.
Тогда по-твоему char buf; int main (){return ++buf;} тоже замыкание?
Тогда по-твоему char buf; int main (){return ++buf;} тоже замыкание?
Нет, т.к. buf - открытая переменная. Ну, тут уже нюансы. Фактически, отождествлять замыкания с объектами языков можно разве что в Haskell. Это всё же абстракция.
Нет, т.к. buf - открытая переменная. Ну, тут уже нюансы. Фактически, отождествлять замыкания с объектами языков можно разве что в Haskell. Это всё же абстракция.
Нет, это не захват. Переменная, объявлена в статической области. В сегменте bss. Захват - это когда из контекста функции захватываются переменные в лямбда функцию
Ты мог и сам добавить в с++ это как-то так: Создаёшь класс, в конструкторе указываешь то, что будет в захвате. Определяет оператор operator(). Этот оператор делает функтор из твоего объекта. По сути создаёшь объект, указывая, что и как захватить и вызываешь его как функцию.