*owner)> render();
};
void freerender(M1 *owner);
struct M1
{
void render()
{
std::cout << " M1 ";
freerender(this);
}
void more_render()
{
std::cout << " more render M1 " << std::endl;
}
M2 mec_2;
};
std::function<void(M1 *owner)> M2::render()
{
auto func = [](M1 *owner) { owner->more_render(); };
return std::ref(func); // тут на локальную переменную func делается ссылка и отдается наружу
// но компилятор молчит. Почему?? Или дело в том, что лямбда она не уничтожается?
// где она тогда хранится? В той же памяти, где и обычные свободные функции?
}
void freerender(M1 *owner)
{
owner->more_render();
}
int main()
{
M1 mec_1;
mec_1.render();
return 0;
}
Это недиагностируемая ситуация
А какой смысл закладывался в возвращении std::ref на лямбду?
Да я где то читал, что когда лямбду отдаешь в std::function, то если завернуть в std::ref , то std::function не будет делать динамическую аллокацию (за счет какого то там буфера малой оптимизации, короче будет работать быстрее, чем передать функцию по значению).
А ссылка на статью не найдётся случайно?
Параграф Solution 3: std::ref() / std::cref() а ссылка вот https://blog.demofox.org/2015/02/25/avoiding-the-performance-hazzards-of-stdfunction/
Судя по статье, это имеет смысл, когда лямбда захватывает ресурсы. А ещё нужно иметь в виду, что захват будет на всех один общий. У вас же лямбда ничего не захватывает. Про провисание ссылки вам уже сказали, так что не буду повторяться.
У референс враппер спец конструктор для функциональных объектов. Накрученный какой-то. Сегодня смотрел, но досконально не разбирался. Возможно смысл этого конструктора в том, что ссылки на функцию в языке нет и он забирает функтор по значению.
Обсуждают сегодня