Передать функторы по значению или по универсальной ссылке C++11? [дубликат]

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

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

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

...Но не лучше ли было бы пройти мимо функторов Универсальные Справочники? Вот так:

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)
{
    ...
}

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