Возможный дубликат:
Должны ли шаблонные функции принимать аргументы лямбда по значению или по ссылке rvalue?
Стандартные библиотечные функции С++ принимают аргументы функтора (указатель функции или объект функции) по значению, например:
template <typename F>
void apply(F func)
{
func();
}
... Но не лучше ли передавать функторы Universal Reference? Например:
template <typename F>
void apply(F&& func)
{
func();
}
Таким образом, вы можете передавать объекты функций, которые сохраняют состояние, и иметь доступ к этому (возможно модифицированному) состоянию после возврата функции более высокого порядка.