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