Пространства имён
Варианты
Действия

Lambda functions (начиная с C++11)

Материал из cppreference.com
< cpp‎ | language


 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Создает замыкание: безымянный объект-функцию, способный захватывать переменные в контекст.
Оригинал:
Constructs a закрытие: an unnamed function object capable of capturing variables in scope.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Синтаксис

[ capture ] ( params ) mutable exception attribute -> ret { body } (1)
[ capture ] ( params ) -> ret { body } (2)
[ capture ] ( params ) { body } (3)
[ capture ] { body } (4)
1)
Полное объявление
Оригинал:
Full declaration
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
Объявление константной лямбды: объекты, захваченные копированием, не могут быть изменены.
Оригинал:
Declaration of a const lambda: the objects captured by copy cannot be modified.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3)
Опущен возвращаемый тип в конце: возвращаемый тип замыкания operator() выводится в соответствии со следующими правилами:
Оригинал:
Omitted trailing-return-type: the return type of the closure's operator() is deduced according to the following rules:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • если body состоит из одного оператора return, то возвращаемый тип является типом возвращаемого выражения (после неявного преобразования rvalue к lvalue, массива к указателю, или функции к указателю)
    Оригинал:
    if the body consists of the single return statement, the return type is the type of the returned expression (after rvalue-to-lvalue, array-to-pointer, or function-to-pointer implicit conversion)
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • В противном случае возвращаемый тип void
    Оригинал:
    otherwise, the return type is void
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
4)
Пропущен список параметров: функция не принимает аргументов, как если бы список параметров был ()
Оригинал:
Omitted parameter list: function takes no arguments, as if the parameter list was ()
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Объяснение

mutable -
позволяет body изменять параметры, захваченные копированием, и вызывать их неконстантные функции-члены
Оригинал:
allows body to modify the parameters captured by copy, and to call their non-const member functions
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
exception -
обеспечивает спецификацию исключения или опцию noexcept для оператора () типа замыкания
Оригинал:
provides the exception specification] or the noexcept пункта for operator() of the closure type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
attribute -
обеспечивает спецификацию атрибута для оператора () типа замыкания
Оригинал:
provides the attribute specification for operator() of the closure type
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
capture -
определяет, какие символы, видимые в области, где функция объявлена, ​​будут видны внутри тела функции.
Оригинал:
specifies which symbols visible in the scope where the function is declared will be visible inside the function body.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Список символов может быть передан следующим образом:
Оригинал:
A list of symbols can be passed as follows:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • [a,&b] где a захвачена по значению и b захвачена по ссылке.
  • [this] захватывает указатель this по значению.
  • [&] захват всех символов по ссылке
  • [=] захват всех символов по значению
  • [] ничего не захватывает
params -
Список параметров, как в имени функции
Оригинал:
The list of parameters, as in named functions
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
ret -
Возвращаемый тип. Если нет, то он выводится из return выражений функции (или void, если она не возвращает никакого значения)
Оригинал:
Return type. If not present it's implied by the function return statements ( or void if it doesn't return any value)
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
body -
Тело функции
Оригинал:
Function body
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.


Лямбда-выражение создает безымянный временный объект уникального безымянного non-union, non-aggregate типа, известного как тип замыкания, который имеет следующие члены:
Оригинал:
The lambda expression constructs an unnamed temporary object of unique unnamed non-union non-aggregate type, known as closure type, which has the following members:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
{{member |
ClosureType ::
Оригинал:
ClosureType::
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
operator(params) | 2=
ret operator()(params) const { body }
(Ключевое слово mutable не было использовано)
ret operator()(params) { body }
(Ключевое слово mutable было использовано)
Исполняет тело лямбда-выражения при вызове. При попытке доступа к переменной получает доступ к захваченной копии (для сущностей, захваченных копированием), или к самому объекту (для сущностей, захваченных по ссылке). Если ключевое слово mutable не было использовано в лямбда-выражении, объекты, захваченные копированием, немодифицируемы внутри этого operator()
Оригинал:
Executes the body of the lambda-expression, when invoked. When accessing a variable, accesses its captured copy (for the entities captured by copy), or the original object (for the entities captured by reference). Unless the keyword mutable was used in the lamda-expression, the objects that were captured by copy are non-modifiable from inside this operator()
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
.

[править]
"Висячие" ссылки
Оригинал:
Dangling references
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Если сущность захвачена по ссылке, явно или неявно, и оператор вызова функции объекта замыкания вызывается после окончания времени жизни этой сущности, это приводит к неопределенному поведению. Замыкания С++ не расширяют время жизни захваченных ссылок.
Оригинал:
If an entity is captured by reference, implicitly or explicitly, and the function call operator of the closure object is invoked after the entity's lifetime has ended, undefined behavior occurs. The C++ closures do not extend the lifetimes of the captured references.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

ClosureType ::
Оригинал:
ClosureType::
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
operator ret(*)(params)

typedef ret(*F)(params);
operator F() const;
Эта функция-член определена только если список захвата лямбда-выражения пуст.
Оригинал:
This member function is only defined if the capture list of the lambda-expression is empty.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Значение, возвращаемое этой функцией преобразования - указатель на функцию, который, будучи вызванным, имеет такой же эффект, как и при вызове функции оператора вызова объекта замыкания напрямую.
Оригинал:
The value returned by this conversion function is a function pointer that, when invoked, has the same effect as invoking the closure object's function call operator directly.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

ClosureType ::
Оригинал:
ClosureType::
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
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 ::
Оригинал:
ClosureType::
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
operator=()

ClosureType& operator=(const ClosureType&) = delete;

Closure types are not CopyAssignable.

ClosureType ::
Оригинал:
ClosureType::
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
~ClosureType()

~ClosureType() = default;

The destructor is implicitly-declared.

ClosureType ::
Оригинал:
ClosureType::
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
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.

Пример

[править] См. также

авто спецификатор
определяет тип определяется выражением (C++11)
Оригинал:
specifies a type defined by an expression (C++11)
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[edit]
(C++11)
обертывания вызываемый объект любого типа с заданной подписью вызова функции
Оригинал:
wraps callable object of any type with specified function call signature
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(шаблон класса) [edit]