2015-12-02 41 views
0

我有以下方法:靜態創建C++ 11 lambda目標嗎?

using async_handler_t = std::function<void(boost::system::error_code, std::size_t)>; 
async_handler_t deadlineHandler(boost::system::error_code &ec) { 
    return [&ec, this](boost::system::error_code newEc, std::size_t) { 
     ec = newEc; 
     deadline_.cancel(); 
    }; 
} 

其停止期限定時器並允許io_service對象運行循環繼續(抓住這個來自官方的ASIO超時文檔)這是一個簡單的ASIO限期處理。

問題是關於函數本身產生了多少次。我明白,我從這個方法返回一個功能對象(std :: function object),它是在運行時動態創建的,但是目標函數只創建一次?

回答

0

lambda表達式隱式聲明瞭一個functor類,並創建它的一個實例。
類的類型(及其代碼operator())的生成當然是在編譯時完成的。
這個類的新實例(包含lambda捕獲的內容)在您每次調用函數時創建。

1

lambda體內的代碼只會被編譯一次,並且該lambda的閉包對象類型的所有實例都將共享該代碼。但是,每次調用deadlineHandler都會導致創建一個閉包類型的新實例,其成員ecthis被初始化,然後將從該實例創建一個std::function對象。