Лямбда-выражения (начиная с C++11)
Создает замыкание — безымянный объект-функцию, способный захватывать переменные в контекст.
Содержание |
[править] Синтаксис
[ capture ] ( params ) mutable exception attribute -> ret { body }
|
(1) | ||||||||
[ capture ] ( params ) -> ret { body }
|
(2) | ||||||||
[ capture ] ( params ) { body }
|
(3) | ||||||||
[ capture ] { body }
|
(4) | ||||||||
1) Полное объявление.
2) Объявление константной лямбды: объекты, захваченные копированием, не могут быть изменены.
3) Опущен возвращаемый тип в конце: возвращаемый тип operator() у замыкания выводится из оператора return словно для функции, чей возвращаемый тип объявлен auto.
4) Пропущен список параметров: функция не принимает аргументов, как если бы список параметров был ().
[править] Объяснение
| mutable | — | позволяет body изменять параметры, захваченные копированием, и вызывать их неконстантные функции-члены |
| exception | — | обеспечивает спецификацию исключения или опцию noexcept для оператора () типа-замыкания |
| attribute | — | обеспечивает спецификацию атрибута для оператора () типа замыкания
Оригинал: provides the attribute specification for operator() of the closure type Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| capture | — | определяет, какие символы, видимые в области объявления функции, будут видны внутри тела функции
Список символов может быть передан следующим образом:
|
| params | — | список параметров, как в объявлении функции |
| ret | — | Возвращаемый тип. Если не указан, то выводится из возвращаемого значения (или void, если функция не возвращает никакого значения).
|
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
ClosureType::operator(params)
| ret operator()(params) const { body } |
(Ключевое слово mutable не было использовано) | |
| ret operator()(params) { body } |
(Ключевое слово mutable было использовано) | |
mutable не было использовано в лямбда-выражении, объекты, захваченные копированием, немодифицируемы внутри этого operator() Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
"Висячие" ссылкиОригинал:Dangling referencesТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
ClosureType::operator ret(*)(params)
| typedef ret(*F)(params); operator F() const; |
||
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
ClosureType::ClosureType()
| ClosureType() = delete; |
||
| ClosureType(const ClosureType& ) = default; |
||
| ClosureType(ClosureType&& ) = default; |
||
Closure types are not DefaultConstructible. The copy constructor and the move constructor are implicitly-declared and may be implicitly-defined according to the usual rules for implicit конструктор копирования and конструктор перемещения.
ClosureType::operator=()
| ClosureType& operator=(const ClosureType&) = delete; |
||
Closure types are not CopyAssignable.
ClosureType::~ClosureType()
| ~ClosureType() = default; |
||
The destructor is implicitly-declared.
ClosureType::CapturedParam
| T1 a; T2 b; |
||
If the lambda-expression captures anything by copy (either implicitly with capture clause [=] or explicitly with a capture that does not include the character &, e.g. [a, b, c]), the closure type includes unnamed non-static data members, declared in unspecified order, that hold copies of all entities that were so captured.
The type of each data member is the type of the corresponding captured entity, except if the entity has reference type (in that case, references to functions are captured as-is, and references to objects are captured as copies of the referenced objects).
For the entities that are captured by reference (with the default capture [&] or when using the character &, e.g. [&a, &b, &c]), it is unspecified if additional data members are declared in the closure type.
[править] Пример
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
#include <vector> #include <iostream> #include <algorithm> #include <functional> int main() { std::vector<int> c { 1,2,3,4,5,6,7 }; int x = 5; c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end()); std::cout << "c: "; for (auto i: c) { std::cout << i << ' '; } std::cout << '\n'; std::function<int (int)> func = [](int i) { return i+4; }; std::cout << "func: " << func(6) << '\n'; }
Вывод:
c: 5 6 7 func: 10
[править] См. также
}}| спецификатор auto | задаёт тип, определяемый выражением (C++11) |
| (C++11) |
обёртывает вызываемый объект любого конструируемого копированием типа с указанной сигнатурой вызова функции (шаблон класса) |

