2012-07-04 85 views
4

我在MSDN頁面上閱讀了這個解釋,瞭解了函數和函數指針相對於lambda表達式的優點。 「保留國家」的能力是什麼意思?它是否與通過ref或value在封閉範圍中捕獲一些變量的能力有關?C++'保留狀態'是什麼意思?

http://msdn.microsoft.com/en-us/library/dd293608.aspx

在編寫代碼時,你可能會使用函數指針和功能 對象來解決問題和進行計算。功能 指針和函數對象有優點和缺點: 函數指針涉及最小的語法開銷,但它們不在 保留一個範圍內的狀態;函數對象可以保持狀態,但是它們需要類定義的語法開銷。

Lambda表達式是一種編程技術,它結合了函數指針和函數對象的好處,並且避免了其缺點。 Lambda表達式非常靈活,並且可以保持 狀態,就像函數對象一樣,並且它們的緊湊語法將刪除需要函數對象所需的類定義的 。 Lambda表達式使您能夠編寫代碼不那麼麻煩 並且比等效的函數對象更不容易出錯。

以下示例將lambda表達式的使用與使用函數對象的 進行了比較。第一個示例使用lambda表達式 向控制檯打印矢量對象中的每個元素是否爲偶數或奇數的 。第二個示例使用函數對象來完成相同的任務 。

您能指出一些相關的主題範圍,狀態,維護狀態,lambda表達式的優點嗎?

感謝和問候

回答

7

函子和lambda都有超過正常功能的能力。這是記住函數調用之間的東西的能力。普通函數具有靜態變量,但是它們是全局唯一的,如果你想要獨立的函數對象具有它們自己獨特的狀態,這是不好的。下面是一個例子函數子類:

class Counter 
{ 
    int n; 
public: 
    Counter() :n(0) {} 
    int operator()() { return n++; }  
}; 

有了這個類,我可以創建作爲一個功能的情況下,並在每次調用它時,它會記住N,例如以前的值

Counter x; 
cout << x() << '\n'; 
cout << x() << '\n'; 
cout << x() << '\n'; 

你不能用普通函數做到這一點。但你可以用lambdas做到這一點:

int n = 0; 
auto x = [=]() mutable { return n++; }; 
cout << x() << '\n'; 
cout << x() << '\n'; 
cout << x() << '\n'; 
+1

哼......你不需要在lambda定義的某個地方使用'mutable'來工作嗎? –

+0

@MatthieuM。是的,謝謝。我幾乎總是通過參考來捕捉,所以我忘了這一點。 –

+0

@BenjaminLindley但是,當通過引用捕獲時,您需要一個可修改的引用對象的修改,不是嗎? –