Подтвердить что ты не робот

Передавать функторы по значению или с помощью С++ 11 Universal Reference?

Возможный дубликат:
Должны ли шаблонные функции принимать аргументы лямбда по значению или по ссылке rvalue?

Стандартные библиотечные функции С++ принимают аргументы функтора (указатель функции или объект функции) по значению, например:

template <typename F>
void apply(F func)
{
    func();
}

... Но не лучше ли передавать функторы Universal Reference? Например:

template <typename F>
void apply(F&& func)
{
    func();
}

Таким образом, вы можете передавать объекты функций, которые сохраняют состояние, и иметь доступ к этому (возможно модифицированному) состоянию после возврата функции более высокого порядка.

4b9b3361

Ответ 1

Это уже относится к некоторым алгоритмам; например, в g++ 4.7.0:

//stl_algo.h

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _UniformRandomNumberGenerator&& __g)
{
    ...
}

Очевидно, что это необходимо для таких вещей, как генераторы случайных чисел. Я предполагаю, что это станет чем-то более распространенным во времени.