在我的C++應用程序(使用Visual Studio 2010),我需要存儲一個std ::功能,如:我應該複製一個std :: function還是我可以總是參考它?
class MyClass
{
public:
typedef std::function<int(int)> MyFunction;
MyClass (Myfunction &myFunction);
private:
MyFunction m_myFunction; // Should I use this one?
MyFunction &m_myFunction; // Or should I use this one?
};
正如你所看到的,我加了函數參數的構造函數的引用。
但是,在我的課程中存儲函數的最佳方法是什麼?
- 我可以存儲函數作爲參考,因爲std :: function只是一個函數指針,函數的'可執行代碼'保證留在內存中嗎?
- 如果lambda傳遞並且調用者返回,我是否必須複製副本?
我的直覺告訴我們,存儲引用(甚至是const引用)是安全的。我期望編譯器在編譯時爲lambda生成代碼,並在應用程序運行時將此可執行代碼保存在「虛擬」內存中。因此,可執行代碼從不「刪除」,我可以安全地存儲對其的引用。但這是真的嗎?
不管std :: function包含什麼......如果你保存一個被引用的引用超出範圍的引用,你就會遇到問題。 – Xeo 2012-01-03 11:16:43
@Alex包裝函數對象的類型lambda或其他,沒有區別。這裏適用於任何可以形成參考(包括指針)的對象。所以,如果你稍後嘗試調用(A)'std :: function'通過'std :: reference_wrapper'傳遞一個函數,其中被引用的函數的生存期已經結束,並且/或者(B)對引用的生命週期結束的'std :: function'。 – 2016-07-17 14:58:00