2015-04-15 65 views
1

我的編碼函數類似於衆所周知的tuple_apply,它們將函數的右值引用作爲參數。 在網絡上我的研究,我碰到以下兩種呼叫:std :: forward的實用程序<Func>致電

template < 
    typename Func, 
    /* stuff */ 
> 
void myfunction(Func && func, /* stuff */) 
{ 
    std::forward<Func>(func)(/* stuff */); // use of std::forward before call 
    func(/* stuff */);      // direct call 
} 

這是調用std::forward真的有用?如果是這樣,爲什

感謝您的啓迪!

回答

2

在大多數情況下,這兩個選項沒有區別。但是,Func可能已經過認證operator()。像下面這樣:

struct Func { 
    operator()(/* stuff */) &&; 
} 

這隻能在R值被調用,所以第二次調用將不能編譯,因爲funcmyfunction是L值。或者,它可以有裁判資格的重載:

struct Func { 
    operator()(/* stuff */) &; 
    operator()(/* stuff */) &&; 
} 

在這種情況下,呼叫而不std::forward將使用第一個過載,無論什麼傳遞給myfunction:左值或R值。另一方面,std::forward的呼叫將基於通過的func對象的l值確定適當的過載。

+0

我承諾。謝謝米哈伊爾:) –

+0

不客氣! – Mikhail

相關問題