按值或通过C++ 11 Universal Reference传递仿函数?

Tom*_*miT 18 c++ functor argument-passing higher-order-functions c++11

可能重复:
模板化函数是应该按值还是通过右值引用获取lambda参数?

C++标准库函数按值获取functor(函数指针或函数对象)参数,如下所示:

template <typename F>
void apply(F func)
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

......但是通过Universal Reference传递仿函数会不会更好?像这样:

template <typename F>
void apply(F&& func)
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以传递维护状态的函数对象,并在返回高阶函数后访问该(可能已修改的)状态.

Yuu*_*shi 8

一些算法就是这种情况; 例如,在g++ 4.7.0:

//stl_algo.h

template<typename _RandomAccessIterator, typename _UniformRandomNumberGenerator>
void
shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
    _UniformRandomNumberGenerator&& __g)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

显然,对于诸如随机数生成器之类的事情来说,这是必不可少的.不过,我想这会成为更常见的事情.