Подтвердить что ты не робот

Лямбда-выражения

Точка, обозначенная пунктом 1.1.2 стандарта ИСО №3290, пункт 19:

Тип замыкания, связанный с lambda-выражение удалено (8.4.3) по умолчанию и удаленный оператор присваивания копии. Это имеет неявно объявленную копию конструктор (12.8) и может иметь неявно объявленный конструктор перемещения (12,8). [Примечание: копия/перемещение конструктор неявно определяется в так же, как и любой другой неявно объявленный конструктор copy/move быть неявно определенными. -end note]

Можно ли кому-нибудь... рассказать пример для этого момента, чтобы понять?

Есть ли шанс/способ проверить объект Closure (тип)?

4b9b3361

Ответ 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;