2012-12-19 82 views
18

可能重复:
Should templated functions take lambda arguments by value or by rvalue reference?按值或通过C++ 11通用参考传递函数?

C++标准库函数采取算符(函数指针或函数对象)参数通过值,如下所示:

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

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

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

这种方式,您可以通过维持状态的函数对象,并有权访问(可能修改)状态下的高阶函数返回之后。

+0

模板在编译时展开/解析。他们怎样才能在编译时了解状态? –

+2

请注意,对于第一个,您始终可以使用引用包装来避免副本。 –

+0

@Manoj R:我的意思是:你有一个函数对象变量fn_obj,你可以调用apply(fn_obj),然后你可以访问fn_obj.state,它可能已经被调用应用修改了 – TommiT

回答

7

这已经是一些算法的情况;例如,在g++ 4.7.0

//stl_algo.h 

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

显然,这是必要的东西,如随机数生成器。然而,我想这会成为更常见的事情。