2012-12-19 84 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) 
{ 
    ... 
} 

顯然,這是必要的東西,如隨機數生成器。然而,我想這會成爲更常見的事情。