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