Size: a a a

2021 January 22

И

Игорь in dlang.ru
не должен а может
источник

Т

Тающий звук... in dlang.ru
Игорь
кто должен, где и как?
Компилятор, я выше описал ситуацию, по которой видно, что он смешал в одну разные переменные, что само по себе является ошибкой — это баг
источник

И

Игорь in dlang.ru
любое приятое решение имеет плюсы и минусы
источник

O

Oleg in dlang.ru
лямбда по сути и есть ее замыкание.. т.е укль на класс и метод, потому что delegate = укль на контекст и метод
источник

O

Oleg in dlang.ru
усё, тяпница, хватит мозоль в мозгу натирать
источник

МВ

Макс Воробьев... in dlang.ru
#include <iostream>


int main() {
   int a = 0;
   std::string hell("test");
   auto l1 = [] () {};
   auto l2 = [a] () {};
   auto l3 = [hell] () {};
   auto l4 = [&hell] () {};
   
   std::cout << sizeof(l1) << std::endl;
   std::cout << sizeof(l2) << std::endl;
   std::cout << sizeof(l3) << std::endl;
   std::cout << sizeof(l4) << std::endl;

   return 0;
}
источник

МВ

Макс Воробьев... in dlang.ru
1
4
32
8
источник

O

Oleg in dlang.ru
и попробуй хоть одну вызвать и тоже спросить ее размер
источник

O

Oleg in dlang.ru
в тело чонить добавь
источник

МВ

Макс Воробьев... in dlang.ru
Oleg
в тело чонить добавь
в тело добавлять - ничего не изменится
источник
2021 January 23

И

Игорь in dlang.ru
вот кстати простейший работающий вариант
источник

И

Игорь in dlang.ru
import std;

auto g(int k) {
   return delegate void() {writeln(k);};
}

void main() {
   alias func = void delegate();
   func[] cbs;
   for (int k=1; k<=3; ++k)
   {
       cbs ~= g(k);
   }
   foreach(d; cbs) d();
}
источник

И

Игорь in dlang.ru
контекст копируется в кучу
источник

DH

Dark Hole in dlang.ru
Игорь
import std;

auto g(int k) {
   return delegate void() {writeln(k);};
}

void main() {
   alias func = void delegate();
   func[] cbs;
   for (int k=1; k<=3; ++k)
   {
       cbs ~= g(k);
   }
   foreach(d; cbs) d();
}
А теперь открой std.functional...
источник

И

Игорь in dlang.ru
и?
источник

DH

Dark Hole in dlang.ru
Там уже есть готовый шаблон для такого)
источник

И

Игорь in dlang.ru
дело не в этом. вчера была дискуссия о том почему в замыкания попадает только последнее значение переменной цикла
источник

И

Игорь in dlang.ru
ответ - потому что контекст - стек, и он один. если стек исчезает то контекст предварительно копируется в кучу и тогда их уже много и каждый со своим значением переменной
источник

O

Oleg in dlang.ru
alias func = void delegate();
func[] cbs;

void fill() {
   for (int k=1; k<=3; ++k)
       cbs ~= () => k.writeln;
}

void main() {
   fill();
   foreach(d; cbs) d();
}

стек исчезает, а печатается 4 4 4 )
источник

O

Oleg in dlang.ru
если заменить
   for (int k=1; k<=3; ++k) {
     int tmp = k;    
       cbs ~= () => tmp.writeln;
   }
печатает 3 3 3 )
источник