c++ c++11 functor argument-passing higher-order-functions

¿Pasa los funtores por valor o por C++ 11 Universal Reference?



c++11 functor (1)

Este ya es el caso con algunos algoritmos; por ejemplo, en g++ 4.7.0 :

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

Obviamente, es imperativo para cosas como los generadores de números aleatorios. Sin embargo, me imagino que esto se convertirá en algo más común en el tiempo.

Posible duplicado:
¿Deberían las funciones de plantilla tomar argumentos lambda por valor o por referencia de valor?

Las funciones de la biblioteca estándar de C ++ toman los argumentos de functor (puntero de función u objeto de función) por valor, de esta manera

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

... ¿Pero no sería mejor pasar los funtores por referencia universal ? Al igual que:

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

De esta manera, podría pasar objetos de función que mantienen el estado y tener acceso a ese estado (posiblemente modificado) después de que la función de orden superior haya regresado.