Лямбда-выражения
Точка, обозначенная пунктом 1.1.2 стандарта ИСО №3290, пункт 19:
Тип замыкания, связанный с lambda-выражение удалено (8.4.3) по умолчанию и удаленный оператор присваивания копии. Это имеет неявно объявленную копию конструктор (12.8) и может иметь неявно объявленный конструктор перемещения (12,8). [Примечание: копия/перемещение конструктор неявно определяется в так же, как и любой другой неявно объявленный конструктор copy/move быть неявно определенными. -end note]
Можно ли кому-нибудь... рассказать пример для этого момента, чтобы понять?
Есть ли шанс/способ проверить объект Closure (тип)?
Ответы
Ответ 1
Тип замыкания, связанный с lambda-выражением, имеет удаленный (8.4.3) конструктор по умолчанию
int main() {
auto closure = [](){};
typedef decltype(closure) ClosureType;
ClosureType closure2; // <-- not allowed
return 0;
}
и оператор назначения удаленной копии. Он имеет неявно объявленный конструктор копирования (12.8) и может иметь неявно объявленный конструктор перемещения (12.8).
#include <utility>
int main() {
auto closure = [](){};
typedef decltype(closure) ClosureType;
ClosureType closure2 = closure; // <-- copy constructor
ClosureType closure3 = std::move(closure); // <-- move constructor
closure2 = closure3; // <-- copy assignment (not allowed)
return 0;
}
Ответ 2
struct LambdaExample{
// deleted operations = not allowed
LambdaExample() = delete;
LambdaExample& operator=(LambdaExample const&) = delete;
// generated by the compiler:
LambdaExample(LambdaExample const& other);
LambdaExample(LambdaExample&& other);
// anything else a lambda needs
};
Для вашего второго вопроса, если вы имеете в виду, что вы можете изучить реализацию, то нетрудно, это невозможно. Он был создан "на лету" компилятором. Если вы хотите получить тип лямбда, обязательно:
auto l = [](){};
typedef decltype(l) closure_type;