Лямбда-выражения - PullRequest
17 голосов
/ 31 мая 2011

Точка из ISO проекта n3290, абзац 5.1.2, пункт 19:

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

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

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

Ответы [ 2 ]

30 голосов
/ 31 мая 2011

Тип замыкания, связанный с лямбда-выражением, имеет удаленный (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;
}
4 голосов
/ 31 мая 2011
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...