Передать функторы по значению или по универсальной ссылке 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)
{
...
}
очевидно, что это необходимо для таких вещей, как генераторы случайных чисел. Я полагаю, что со временем это станет чем-то более распространенным.