Лямбда с фиксацией ссылок.

Logik
Offline
Зарегистрирован: 05.08.2014

Играюсь  с лямбдами на ИДЕ 1.6.5

Сокращенный код

void ShowScr(void (*p)()=0, byte nextmode=0)
{
}
void loop(void)
{
  static word Minut;
  ShowScr([Minut](){});
}

Работает. Но стоит убрать static -  ошибка комптляции

TermoControl.ino: In function 'void loop()':
TermoControl:660: error: cannot convert 'loop()::__lambda1' to 'void (*)()' for argument '1' to 'void ShowScr(void (*)(), byte)'
cannot convert 'loop()::__lambda1' to 'void (*)()' for argument '1' to 'void ShowScr(void (*)(), byte)'

В стандарте пишется (цитата с msdn) "Кроме того, лямбда-выражения могут использовать, или фиксировать, переменные из окружающей области видимости.

Получается, не все из области, только глобальные? Или я чего не понимаю.

toc
Offline
Зарегистрирован: 09.02.2013

Добрый вечер!
По-моему слово Minut не нужно вовсе.
У меня так работает:
http://ideone.com/2BSDdz

Но это другая IDE.
Одна из фишек лямбд - анонимность.

Logik
Offline
Зарегистрирован: 05.08.2014

Так без фиксации переменных и у меня все работает. Анонимность конечно фишка, но не плохо бы и к глобальным уметь обратится из функции. Для этого и фиксация. Но похоже я её недопонял. Вот сижу и понимаю что непонимаю)) Рассуждаю так - время жизни лямбды не ограничивается работой той функции в которую она передается, её можна сохранить в глобальную переменную и вызвать совсем из другого места. Очевидно, что тогда все, что распределялось в стеке будет не валидно. Потому фиксация по ссылке локальных переменных станет безсмыслена и вызывает ошибку, но почему на стадии компиляции? Ведь при вызовах из функции куда лямбду непосредственно передали все выглядит корректно. С фиксацией по значению все еще мутней. Где копии фиксируемых переменных (та самая Minut) хранятся? ну допустим на стеке. Но тогда при вызове не из функции куда передавали, стек невалидный, все упало... Чертишо.. Пока относится к лямбдам как к неименованым функциям для передачи как параметр, все понятно аж противно ))) Но с фиксацией мутно..

toc
Offline
Зарегистрирован: 09.02.2013

я не так понял вопрос. Не знаю ответ. Может это http://stackoverflow.com/questions/7852101/c-lambda-with-captures-as-a-f...

Logik
Offline
Зарегистрирован: 05.08.2014

Спасибо за ссылку. Приятно почитать о том, что я не один непонимаю)). Решения предложеные там в обход, через шаблоны, в общем то не интересны. Я как взялся за эти лямбды расчитывал получить простое и красивое решение, и вобщем получилось поубирать функции колбеки. Но пустые квадратные скобки интриговали. Почитав о этой самой фиксации сложилось впечатление что ести интересный механизм сокращающий ручную работу. Но не судьба. Лет через 5 гляну, или доделают или народ разберется что да как.