C++ 0x - лямбда-выражение действительно смотрит то же как анонимный внутренний класс Java?

Моя интерпретация лямбда-выражения в контексте C++ и Java, корректно?

6
задан Johannes Schaub - litb 2 October 2011 в 10:36
поделиться

3 ответа

Они не совсем одинаковы. Оба создают безымянные классы, но на этом их сходство заканчивается.

В C++ вы создаете замыкание, фиксирующее ваши локальные переменные, опционально по ссылке. В Java вы просто получаете снимок значений текущей локальной переменной (и эти переменные должны быть "конечными").

Цель анонимных внутренних классов - расширить другой класс или реализовать другой интерфейс ad-hoc. По этой причине анонимные внутренние классы могут в некоторой степени имитировать работу лямбда-выражений, например, реализуя интерфейс Runnable. Лямбда-выражения специально предназначены для вызова и возможного изменения локальных переменных в своем окружении.

5
ответ дан 9 December 2019 в 20:39
поделиться

Анонимный внутренний класс Java может ссылаться на final данные в включающем методе и на все данные (включая изменяемые) во включающем классе. Таким образом, методы в анонимных классах не могут изменять значения переменных в включающем методе, но они могут изменять значения членов в включающем классе.

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

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

Сравните с лямбда-выражениями C #, которые не имеют ограничений и все зависимости являются неявными. Это делает их, безусловно, наименее подробными из этих функций (чему также способствует лучший вывод типов). Но с другой стороны, они аннулируют все простые правила, касающиеся потоковой передачи, т.е. больше не обязательно верно, что локальные переменные находятся «в стеке потока» и, следовательно, никогда не требуют блокировки перед доступом.

5
ответ дан 9 December 2019 в 20:39
поделиться

Лямбда-выражения C ++ 0x - это безымянные методы , анонимные классы Javas - это безымянные классы . Так что у них нет имени, но концепции разные.

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

Кстати - википедия упоминает, что для C ++ 0x предлагаются только лямбда функции .

2
ответ дан 9 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: