Каков срок жизни лямбда-выражения C ++?

(Я прочитал Каков срок жизни неявных функторов, производных от лямбда в C ++? уже и не дает ответа на этот вопрос.)

Я понимаю, что синтаксис лямбда C ++ - это просто сахар для создания экземпляра анонимного класса с оператор вызова и некоторое состояние, и я понимаю требования к продолжительности жизни этого состояния (в зависимости от того, захватываете ли вы по значению по ссылке.) Но каково время жизни самого лямбда-объекта? В следующем примере будет ли полезен возвращенный экземпляр std :: function ?

std::function meta_add(int x) {
    auto add = [x](int y) { return x + y; };
    return add;
}

Если да, как он работает ? Мне это кажется слишком большим волшебством - я могу только представить, что он работает, std :: function копируя весь мой экземпляр, что может быть очень тяжелым в зависимости от того, что я захватил - в прошлом я использовал std :: function в основном с голыми указателями на функции, и их можно быстро скопировать. Это также кажется проблематичным в свете стирания типа std :: function .

66
задан Community 23 May 2017 в 12:32
поделиться