Доброй ночи.
Допустим, есть вот такая функция:
//считаем, что у всех T, с которыми вызывают функцию, есть преобразование в int
template <typename T>
std::function<int(int)> maker(T param) {
return [param](int x) {return x + param; };
}
Далее она используется как-то так:
auto f1 = maker(1);
auto f2 = f1;
///... какая-то работа с f1 и f2
Насколько я понимаю, увидев лямбда-функцию, компилятор создаст специальный объект, одним из полей которого и будут данные, переданные в param.
Далее этот объект будет храниться где-то в недрах std::function.
А далее вопросы (если это где-то уже обсуждалось — киньте ссылкой, пожалуйста):
1. каково время жизни этого объекта?
2. Где он создается — на стеке или в куче? Или он вообще static?
3. Для нескольких вызовов maker с одинаковым параметром будет создано несколько лямбда-объектов, или будет использован один и тот же?
4. Как std::function хранит внутри себя неизвестный объем данных? Ведь при объявлении f2 ничего не известно про то, какой контекст будет у соответствующей std::function. Как компилятор понимает, сколько памяти надо выделить под f2? Или внутри просто pimpl на нужный объект?
5. Что происходит при присваивании f2 = f1? Происходит ли копирование лямбда-объекта?