Возможный дубликат:
Должны ли шаблонные функции принимать лямбда-аргументы по значению или по rvalue-ссылке?
Функции стандартной библиотеки C ++ принимают аргументы функтора (указатель на функцию или объект функции) по значению, например:
template <typename F>
void apply(F func)
{
func();
}
…Но не лучше ли передать функторы Универсальная ссылка? Вот так:
template <typename F>
void apply(F&& func)
{
func();
}
Таким образом, вы можете передать функциональные объекты, которые поддерживают состояние, и иметь доступ к этому (возможно, измененному) состоянию после возврата функции более высокого порядка.
Это уже имеет место с некоторыми алгоритмами; например, в g++ 4.7.0
:
//stl_algo.h
template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
_UniformRandomNumberGenerator&& __g)
{
...
}
Очевидно, что это необходимо для таких вещей, как генераторы случайных чисел. Я полагаю, что со временем это станет чем-то более распространенным.
Других решений пока нет …